Pandas如何按每日01:00起始的偏移24小时窗口对日内数据分组聚合
解决方案
最优方案1:时间索引偏移后分组(代码最简洁)
核心逻辑是把所有时间戳向前偏移1小时,让自定义窗口的起始点(每日01:00)对齐到自然日的00:00,直接按偏移后的日期分组即可,完全符合需求:
import pandas as pd # 核心代码,一行实现 agg_result = df.groupby((df.index - pd.Timedelta(hours=1)).date)['var'].sum()
逻辑验证
- 原时间戳
2021-01-01 01:00:00减1小时后为2021-01-01 00:00:00,对应分组日期2021-01-01 - 原时间戳
2021-01-02 00:59:59减1小时后为2021-01-01 23:59:59,同样对应分组日期2021-01-01 - 所有时间点刚好被划分到要求的24小时窗口中,不需要额外创建标记列,性能远高于自定义标记分组。
最优方案2:resample自定义窗口(时序操作更灵活)
如果你的pandas版本≥1.3.0,用resample的origin参数可以直接定义窗口起始点,适合后续需要继续做时序处理的场景:
# 按每日01:00为起点的24小时窗口聚合,标签取窗口起始时间 agg_result = df.resample( rule='24h', origin='1h', # 窗口起始偏移1小时 closed='left', # 窗口左闭右开,包含起始01:00,不包含次日01:00 label='left' # 聚合结果的索引用窗口起始时间标记 ).sum() # 如果需要把索引转为日期格式,可以再加一步 agg_result.index = agg_result.index.date
两种方案性能差异不大,根据后续的使用场景选择即可,都比通过标记列自定义分组的方式效率高3~10倍(数据量越大优势越明显)。
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

