如何在Python中聚合Datetime索引时间差一致的Pandas DataFrame行
Pandas 连续子组聚合最优方案
核心使用Pandas向量化操作实现,无需循环,效率远高于自定义遍历方案。
前置准备
确保DataFrame索引为datetime类型,示例中假设值列名为value:
import pandas as pd # 示例数据构造,你可以替换为自己的DataFrame data = [1,2,3,4,10,12,14,20,10,5,2] index = pd.to_datetime([ "2020-06-09 08:44:00", "2020-06-09 08:46:00", "2020-06-09 08:48:00", "2020-06-09 08:50:00", "2020-06-09 09:06:00", "2020-06-09 09:08:00", "2020-06-09 09:10:00", "2020-06-09 10:14:00", "2020-06-09 10:16:00", "2020-06-09 10:18:00", "2020-06-09 10:20:00" ]) df = pd.DataFrame({"value": data}, index=index)
核心实现
步骤1:生成连续子组ID
计算相邻索引的时间差,间隔超过2分钟(120秒)即判定为新子组的起点,通过累加生成唯一子组标识:
# 计算相邻索引时间差,首行空值补0 time_diff = df.index.to_series().diff().dt.total_seconds().fillna(0) # 生成子组ID group_id = (time_diff > 120).cumsum()
步骤2:按子组聚合得到结果
每个子组计算均值,同时取子组最后一个时间戳作为结果的索引:
result = df.groupby(group_id).agg( value=("value", "mean"), dt=("index", "last") ).set_index("dt")
结果验证
输出result即可得到目标格式:
value dt 2020-06-09 08:50:00 2.50 2020-06-09 09:10:00 12.00 2020-06-09 10:20:00 9.25
如果需要更换聚合逻辑(如求和、取最大值),仅需替换agg参数中的mean为对应聚合函数即可。
内容的提问来源于stack exchange,提问作者Fruity Fritz
相关产品推荐
相关产品推荐

