#********** Begin **********# #采用分块读取的方式,读取“159站点8月份刷卡数据.csv”数据表,每次读取10000条记录 #其中数据表有两个字段,依次为: # 刷卡类型(21-表示进站,22-表示出站) # 刷卡时间,精确到毫秒,示例如:“2015-08-01-22.50.02.000000” #任务如下: # 1.采用二分法,获得1~30日(最后一天除外)每天最后一条刷卡记录的刷卡时间,以及对应的 # index值(即数据框中的行标号),用一个元组来表示r, # 最后1~30日每天的r,则用一个嵌套列表r_d来表示 # 2.返回r_d,即每天最后一条刷卡记录的刷卡时间和对应的行记录标号,方便后续快速统计计算 def return_values(): import pandas as pd reader=pd.read_csv('159站点8月份刷卡数据.csv',sep=','),chunksize=10000,usecols=[1],engine='python') r_d=[] for A in reader: a0=int(A.iloc[0,0][8:10]) a2=int(A.iloc[len(A)-1,0][8:10]) if a0!=a2: r=find_index(A,a0,a2) r_d.append(r) return r_d #********** End **********#
时间: 2025-06-12 21:46:43 浏览: 13
### 分块读取CSV文件并使用二分法获取每天最后一条刷卡记录
在处理大规模CSV文件时,分块读取是一种高效的方法,可以减少内存占用。通过结合二分查找算法,可以快速定位每天最后一条刷卡记录的时间和对应的行标号。以下是实现该功能的详细方法:
#### 方法描述
1. 使用 `pandas.read_csv` 的 `chunksize` 参数分块读取CSV文件[^2]。
2. 对每个分块数据进行预处理,提取日期信息,并按日期排序。
3. 使用二分查找算法(例如 `bisect` 模块)在每块数据中查找每天最后一条刷卡记录的时间和行标号。
#### 实现代码
以下是一个完整的函数实现:
```python
import pandas as pd
import bisect
def find_last_swipe_per_day(file_path, date_column, chunksize=10000):
"""
通过分块读取CSV文件并使用二分法找到每天最后一条刷卡记录的时间和行标号。
参数:
- file_path: CSV文件路径
- date_column: 包含日期信息的列名
- chunksize: 每块数据的大小
返回:
- result: 列表,包含每天最后一条刷卡记录的时间和行标号
"""
result = []
row_index = 0 # 全局行标号
for chunk in pd.read_csv(file_path, chunksize=chunksize): # 分块读取
chunk[date_column] = pd.to_datetime(chunk[date_column]) # 转换日期列
unique_days = sorted(chunk[date_column].dt.date.unique()) # 获取唯一日期
for day in unique_days:
filtered_chunk = chunk[chunk[date_column].dt.date == day] # 筛选当天数据
times = list(filtered_chunk[date_column]) # 提取时间列表
if not times:
continue
# 使用二分查找找到当天最后一条记录的位置
last_time = max(times)
last_time_index_in_chunk = bisect.bisect_right(times, last_time) - 1
global_row_index = row_index + last_time_index_in_chunk
result.append((str(day), last_time.strftime('%Y-%m-%d %H:%M:%S'), global_row_index))
row_index += len(chunk) # 更新全局行标号
return result
```
#### 示例用法
假设CSV文件名为 `swipe_data.csv`,日期列名为 `swipe_time`,可以通过以下方式调用函数:
```python
file_path = 'swipe_data.csv'
date_column = 'swipe_time'
last_swipes = find_last_swipe_per_day(file_path, date_column)
for record in last_swipes:
print(f"日期: {record[0]}, 最后刷卡时间: {record[1]}, 行标号: {record[2]}")
```
#### 关键点解释
1. **分块读取**:通过设置 `chunksize` 参数,将大文件分成小块处理,避免一次性加载所有数据导致内存不足[^3]。
2. **日期转换**:使用 `pd.to_datetime` 将日期字符串转换为 `datetime` 对象,便于后续操作。
3. **二分查找**:利用 `bisect` 模块在有序列表中快速定位目标值[^4]。
---
###
阅读全文
相关推荐













