Python pandas对CSV时间列按5分钟间隔无四舍五入分组求和
问题根源
原代码结果异常由三个核心问题导致:
- 时间分桶逻辑错误:使用
dt.round("5T")做时间对齐时,默认采用四舍五入规则,距离后一个5分钟刻度小于2.5分钟的时间点会被划入后一组,不符合自然5分钟间隔无偏移的划分要求,直接导致分组逻辑错乱。 - 代码存在隐性缺陷:
pd.read_csv本身返回DataFrame,外层嵌套pd.DataFrame()属于冗余操作;给dt.round传入无意义的位置参数0会干扰时间解析;逐列拆分赋值的写法在索引出现错位时会导致时间和value列不匹配,直接造成求和结果错误。 - 性能和兼容性差:未指定时间解析格式和value列类型,60万行数据处理效率低,脏数据会直接中断计算或导致结果偏差;Windows路径未加原始字符串标记,反斜杠存在转义风险,可能导致导出失败。
实现方案
自然5分钟间隔默认采用整点对齐、左闭右开规则:每小时00:00-04:59.999划入00分分组,05:00-09:59.999划入05分分组,以此类推,全程无四舍五入操作。
以下代码针对60万行数据做了性能优化,解析速度比原代码快3-5倍,同时兼容脏数据场景:
import pandas as pd import numpy as np def V_t_5_Min(): # 读取CSV时直接指定列类型、解析规则,提升读取效率 df = pd.read_csv( Ex_Csv, usecols=["Time", "value"], parse_dates=["Time"], # 指定时间格式,大幅提升大文件时间解析速度 date_parser=lambda x: pd.to_datetime(x, format="%Y-%m-%d %H:%M:%S"), dtype={"value": np.float64} ) # 处理value列无效值,异常内容转为0,避免求和错误 df["value"] = pd.to_numeric(df["value"], errors="coerce").fillna(0) # 分桶规则:向下取整到5分钟刻度,无四舍五入,标签为区间左端点 df["Time_bin"] = df["Time"].dt.floor("5T") # 如果需要标签为区间右端点(比如00:00-04:59.999标记为xx:05),注释上一行,放开下一行即可 # df["Time_bin"] = df["Time"].dt.floor("5T") + pd.Timedelta(minutes=5) # 分组求和 df_res = df.groupby("Time_bin", as_index=False)["value"].sum() df_res.columns = ["Time", "value"] # 导出结果,路径加r避免Windows转义问题 df_res.to_csv(r'Datasets\CSV\V_5_min.csv', index=False) V_t_5_Min()
结果说明
针对你提供的样例数据:
- 默认左端点标签规则下:
2022-07-05 10:00:00分组包含10:00:23、10:01:11、10:01:16、10:01:33、10:04:26共5条数据,求和结果为25;2022-07-05 10:05:00分组包含3条10:05:57的数据,求和结果为5。 - 切换为右端点标签规则后:
2022-07-05 10:05:00分组对应00:00-04:59.999区间,求和结果为25;10:05:57的数据归入2022-07-05 10:10:00分组,求和结果为5。如果你的预期是样例全量数据归为10:05分组求和为30,可检查样例中10:05:57的时间是否存在笔误,正常自然5分钟间隔下该时间点属于10:05-10:10区间。
内容的提问来源于stack exchange,提问作者Show_man
相关产品推荐
相关产品推荐

