python时间窗口计算分三类:resample用于等距分箱(如'5t'),rolling用于滑动窗口(需on参数指定时间列),手动构造适用于不规则逻辑;均需确保时间索引正确、时区统一。

Python中做时间窗口计算,核心是把时间序列数据按固定时长切片,再对每个片段做聚合或分析。滑动窗口的关键在于“时间驱动”而非“行数驱动”,即窗口边界由时间戳决定,不是简单取前N行。
用pandas的resample做等距时间分箱
适合规则频率(如每5分钟、每天)的聚合场景。它会自动对齐时间边界,缺失时段可填充或跳过。
- 确保索引是
datetime类型:df.index = pd.to_datetime(df.index) - 按5分钟聚合均值:
df.resample('5T').mean()('5T'表示5分钟) - 自定义聚合函数:
df.resample('1H').agg({'value': 'sum', 'flag': 'max'}) - 注意:resample默认以左边界对齐,可用
origin='start'或offset调整起始点
用pandas的rolling配合time-based window
适合滑动计算(如最近1小时内的滚动均值),窗口随时间连续移动,不强制对齐整点。
- 必须用
on参数指定时间列(不能只靠DatetimeIndex):df.rolling('1H', on='timestamp').mean() - 时间字符串支持单位:'10S'、'30T'、'2H'、'7D'等
- 注意:该方法要求
timestamp列已排序且无重复;否则结果不可靠 - 若需右闭合窗口(含当前行),加
closed='both'(默认是'right')
手动构造时间窗口:适用于复杂逻辑
当窗口规则不规则(如每个自然日+前1天、或按事件触发)时,需自己标记窗口ID。
立即学习“Python免费学习笔记(深入)”;
- 用
pd.cut或pd.Grouper生成分组键:df['window'] = pd.cut(df['ts'], bins=pd.date_range('2023-01-01', freq='24H', periods=10)) - 用布尔索引+循环遍历每个起点,结合
df.loc[(df.ts >= start) & (df.ts 提取子集 - 更高效的做法是用
searchsorted定位左右边界索引,避免重复扫描
性能与边界注意事项
大数据量下,时间窗口计算容易成为瓶颈,尤其涉及重复排序或多重循环时。
- 提前
sort_values(by='timestamp')并设为索引,能大幅提升rolling和切片效率 - 避免在循环里反复调用
df[df.time > t]——改用numpy.searchsorted定位位置 - 注意时区:统一转为UTC或本地时区,防止跨天窗口错位
- 空窗口默认返回NaN,可用
min_periods=1降低触发阈值










