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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:14:57