分块读取大CSV时间序列resample时如何避免切分15分钟统计区间
分块读取时间序列CSV解决重采样边界拆分问题
核心思路
通过缓存每个分块末尾未结束的15分钟区间数据,和下一分块合并后再做重采样,避免统计区间被拆分。
补全后完整代码
import pandas as pd source_file = './timeseries.csv' chunksize = 10 ** 6 # 初始化缓存变量,存储上一分块末尾不完整的15分钟区间数据 buffered_chunk = pd.DataFrame() for chunk in pd.read_csv( source_file, chunksize=chunksize, delimiter=';', decimal=',', na_values='.', index_col=0, parse_dates=[0,]): # 切出当前分块中所有属于完整15分钟区间的部分 closed_15min_chunk = chunk[chunk.index < chunk.index[-1].floor('15min')] # 注意修正原代码的变量名拼写错误:closed15_min_chunk 改为 closed_15min_chunk usable_chunk = pd.concat([buffered_chunk, closed_15min_chunk]) # 缓存当前分块末尾不完整的15分钟区间数据,留到下一分块合并 buffered_chunk = chunk[chunk.index >= chunk.index[-1].floor('15min')] if not usable_chunk.empty: avg_chunk = usable_chunk.resample('15min').mean().round(2) max_chunk = usable_chunk.resample('15min').max().round(2) print(avg_chunk) # 循环结束后处理最后剩余的不完整区间数据 if not buffered_chunk.empty: avg_last = buffered_chunk.resample('15min').mean().round(2) max_last = buffered_chunk.resample('15min').max().round(2) print(avg_last)
逻辑说明
floor('15min')方法会将任意时间戳对齐到其所属15分钟区间的起始时间,例如12:08:34会对齐到12:00:00,12:17:22会对齐到12:15:00- 所有早于当前分块最后一个时间戳所属15分钟区间起始的行,都属于已经结束的完整统计区间,可以直接参与本次计算
- 剩余属于未结束区间的行存入缓存,和下一个分块的数据合并后再统计,完全避免区间被拆分的问题
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

