Pandas 2.1.1中datetime64[us]类型下rolling窗口结果异常原因咨询
Pandas 2.1.1中datetime64[us]类型下rolling窗口求和异常的原因
问题场景
现有如下数据框df:
day x 0 2021-01-01 3 1 2021-01-02 2 2 2021-01-03 1 3 2021-01-05 4 4 2021-01-08 2 5 2021-01-14 5 6 2021-01-15 6 7 2021-01-16 1 8 2021-01-19 5 9 2021-01-20 2
初始数据类型:
day datetime64[ns] x int64 dtype: object
执行代码df.rolling("3d", on="day", center=True)["x"].sum()后,得到符合预期的滚动求和结果:
0 5.0 1 6.0 2 3.0 3 4.0 4 2.0 5 11.0 6 12.0 7 7.0 8 7.0 9 7.0 Name: x, dtype: float64
但将day列转为datetime64[us]类型(执行df["day"] = df["day"].astype("datetime64[us]"))后,用相同代码执行滚动窗口求和,得到全为31.0的异常结果:
0 31.0 1 31.0 2 31.0 3 31.0 4 31.0 5 31.0 6 31.0 7 31.0 8 31.0 9 31.0 Name: x, dtype: float64
异常原因
这是Pandas 2.1.1版本的已知bug,根源在于时间单位不匹配导致的窗口边界计算错误:
- 当用时间字符串(如
"3d")定义滚动窗口时,Pandas默认会将其转换为纳秒(ns)级的时间增量。但当目标时间列是微秒(us)类型时,内部的时间比较逻辑错误地把纳秒级的增量值当作微秒来处理。 - 举个例子,
"3d"对应的纳秒值是259200000000000,如果被当作微秒,就相当于约3000天,远大于数据集中的时间跨度。 - 这就导致每个滚动窗口都包含了数据框里的所有行,而所有
x值的总和正好是3+2+1+4+2+5+6+1+5+2=31,所以结果全为31.0。
该bug在Pandas 2.1.2及后续版本中已被修复,升级Pandas即可解决这个问题。
内容的提问来源于stack exchange,提问作者DustByte
相关产品推荐
相关产品推荐

