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

Pandas Datetime Series差值计算不符合预期的问题求助

问题:Pandas计算相邻时间差值结果不符合预期

最小可复现代码:

import pandas as pd

df = pd.DataFrame({"datetime": 
    [
        "2021-09-01 00:00:01",
        "2021-09-01 00:00:02",
        "2021-09-01 00:00:03",
        "2021-09-01 00:00:04",
        "2021-09-01 00:00:05",
        "2021-09-01 00:00:06",
        "2021-09-01 00:00:07",
        "2021-09-01 00:00:08",
        "2021-09-01 00:00:09",
        "2021-09-01 00:00:10",
    ]}
)
df["datetime"] = pd.to_datetime(df["datetime"])
delta = df["datetime"][1::] - df["datetime"][0:-1]
print(delta)

运行结果:

0      NaT
1   0 days
2   0 days
3   0 days
4   0 days
5   0 days
6   0 days
7   0 days
8   0 days
9      NaT
Name: datetime, dtype: timedelta64[ns]

预期结果应该是全部为Timedelta('0 days 00:00:01')的数组。另外单独执行df["datetime"][1] - df["datetime"][0]能得到预期结果,但执行df["datetime"][1:2] - df["datetime"][0:1]却得到:

0   NaT
1   NaT
Name: datetime, dtype: timedelta64[ns]

原因分析

核心问题是Pandas的索引对齐机制:当对两个Series执行算术运算时,Pandas会按照元素的索引值进行匹配计算,而不是按元素的位置顺序匹配。

  • df["datetime"][1::]的索引是[1,2,...,9],对应原数据的第2到第10个元素;
  • df["datetime"][0:-1]的索引是[0,1,...,8],对应原数据的第1到第9个元素;

两者相减时:

  • 索引0只存在于第二个Series中,索引9只存在于第一个Series中,无法匹配,结果为NaT;
  • 中间索引1-8在两个Series中都存在,但匹配的是同索引的元素(比如第一个Series的索引1对应第二个Series的索引1),也就是同一个时间值相减,结果为0 days。

同理,df["datetime"][1:2]的索引是[1],df["datetime"][0:1]的索引是[0],两者没有共同索引,所以结果全为NaT。而单独取标量(df["datetime"][1]和df["datetime"][0])时,不存在索引匹配问题,直接计算差值。

解决方法

要按位置顺序计算相邻元素的差值,需要使用位置索引.iloc,它会忽略索引,直接按元素的位置进行操作:

delta = df["datetime"].iloc[1:] - df["datetime"].iloc[:-1]
print(delta)

运行结果:

0   0 days 00:00:01
1   0 days 00:00:01
2   0 days 00:00:01
3   0 days 00:00:01
4   0 days 00:00:01
5   0 days 00:00:01
6   0 days 00:00:01
7   0 days 00:00:01
8   0 days 00:00:01
Name: datetime, dtype: timedelta64[ns]

另外,也可以使用Pandas内置的diff()方法直接计算相邻元素的差值,更简洁:

delta = df["datetime"].diff()
print(delta.dropna())  # 去掉第一个NaN值

运行结果:

1   0 days 00:00:01
2   0 days 00:00:01
3   0 days 00:00:01
4   0 days 00:00:01
5   0 days 00:00:01
6   0 days 00:00:01
7   0 days 00:00:01
8   0 days 00:00:01
9   0 days 00:00:01
Name: datetime, dtype: timedelta64[ns]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:13