You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:06:18