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
相关产品推荐
相关产品推荐

