Pandas如何实现每4小时生成时长8小时的重叠时间分组
解决方案
问题原因
pd.Grouper是按照固定频率做无重叠的时间区间分组,每个时间点只会归属到唯一分组,天生不支持重叠分组的需求,重叠时间分组属于滑动窗口的典型应用场景,应该使用 pandas 提供的滑动窗口相关接口实现。
实现方法
方法1:高版本pandas直接使用rolling接口(pandas ≥ 1.3.0推荐)
直接通过rolling指定时间窗口长度和滑动步长即可,代码如下:
import pandas as pd # 定义窗口长度和滑动步长 window_len = '8H' step_hour = 4 # 因为索引是小时级频率,step=4等价于每4小时滑动一次 # 可替换agg内的聚合函数为你需要的计算逻辑,比如sum、自定义函数等 result = df.rolling(window=window_len, step=step_hour).agg('mean')
该方法会自动过滤掉长度不足8小时的尾部窗口,结果的索引为每个窗口的结束时间。
方法2:遍历生成窗口(全版本兼容)
如果你的pandas版本较低不支持step参数,可以手动生成所有窗口的起始时间,逐个截取窗口处理:
import pandas as pd from datetime import timedelta window_len = timedelta(hours=8) step = timedelta(hours=4) # 生成所有合法的窗口起始时间(保证窗口长度不小于8小时) start_times = pd.date_range( start=df.index.min(), end=df.index.max() - window_len, freq=step, tz='UTC' ) # 遍历处理每个窗口 window_results = [] for start in start_times: end = start + window_len current_window = df.loc[start:end] # 这里写你需要的处理逻辑,示例为计算均值 window_res = current_window.mean() window_res.name = start # 可以指定索引为窗口起始时间 window_results.append(window_res) # 合并所有窗口的结果 final_result = pd.DataFrame(window_results)
效果验证
以你提供的索引前几个时间点为例,生成的窗口完全符合需求:
- 第一个窗口:
2020-12-31 23:00:00+00:00~2021-01-01 07:00:00+00:00,共8小时数据 - 第二个窗口:
2021-01-01 03:00:00+00:00~2021-01-01 11:00:00+00:00,和前一个窗口重叠4小时
内容的提问来源于stack exchange,提问作者fourloops
相关产品推荐
相关产品推荐

