You need to enable JavaScript to run this app. pandas索引非日期类型时使用偏移量实现rolling滚动计算的方法
优惠活动
大模型
产品
解决方案
定价
更多

pandas索引非日期类型时使用偏移量实现rolling滚动计算的方法

问题描述

现有如下DataFrame:

import pandas as pd
import numpy as np
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},index=[0.1,0.2,0.5,0.7,0.9])

原始输出结果:

B
0.1  0.0
0.2  1.0
0.5  2.0
0.7  NaN
0.9  4.0

需要基于数值偏移量执行滚动计算,运行df.rolling(0.3).sum()时报错:

ValueError: window must be an integer

实际业务场景涉及约10亿行数据,最终需要执行groupby().rolling()操作,上述为问题极简示例。

解决方案

该问题最优解法由GitHub用户mroeschke提供,核心逻辑是将数值型索引转换为datetime时间戳类型,即可使用pandas原生支持的时间偏移量滚动窗口,计算逻辑和数值偏移完全一致,性能适配大数据量场景,代码实现如下:

In [1]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},index=[0.1,0.2,0.5,0.7,0.9])

# 将数值索引转换为秒单位的时间戳
In [2]: df.index = pd.to_datetime(df.index, unit="s")

# 300ms时间窗口对应0.3的数值偏移,可替换为sum等其他聚合函数
In [3]: df.rolling("300ms").mean()
Out[3]:
                           B
1970-01-01 00:00:00.100  0.0
1970-01-01 00:00:00.200  0.5
1970-01-01 00:00:00.500  2.0
1970-01-01 00:00:00.700  2.0
1970-01-01 00:00:00.900  4.0

如果需要保留原数值索引的展示形式,计算完成后可再将时间索引转换回数值类型:

df.index = df.index.astype(np.int64) / 10**9

内容的提问来源于stack exchange,提问作者user40780

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 18:21:02