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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:00:00