计算DateTimeIndex的时间差

22

我想计算DateTimeIndex中时间之间的时间差。

import pandas as pd
p = pd.DatetimeIndex(['1985-11-14', '1985-11-28', '1985-12-14', '1985-12-28'], dtype='datetime64[ns]')
我可以计算两个时间之间的时间差:
p[1] - p[0]

提供

Timedelta('14 days 00:00:00')

但是 p[1:] - p[:-1] 不起作用并会给出

DatetimeIndex(['1985-12-28'], dtype='datetime64[ns]', freq=None)

以及一个未来的警告:

FutureWarning: using '-' to provide set differences with datetimelike Indexes is deprecated, use .difference()

你有什么想法可以(轻松地)计算DateTimeIndex中值之间的时间差吗?为什么它适用于一个值,但不适用于整个DateTimeIndex?

3个回答

36

使用to_series()DatetimeIndex转换为Series,然后调用diff计算行间差异:

In [5]:
p.to_series().diff()

Out[5]:
1985-11-14       NaT
1985-11-28   14 days
1985-12-14   16 days
1985-12-28   14 days
dtype: timedelta64[ns]

关于为什么它失败了,这里的-运算符试图执行不同索引范围的集合差异或交集,你试图用一个范围的值减去另一个范围的值,这就是diff所做的。
当你执行p[1] - p[0]时,-执行的是标量减法,但当你在索引上执行此操作时,它认为你正在执行一个集合操作。

1
< p > - 运算符是有效的,只是它所做的不是你期望的。在第二种情况下,它的作用是给出两个日期时间索引的差异,即在 p [1:] 中存在但不在 p [:-1] 中的值。

可能有更好的解决方案,但逐个元素执行操作是可行的:

[e - k for e,k in zip(p[1:], p[:-1])]

0

我使用了None来填充第一个差异值,但我相信你可以想出如何处理这种情况。

>>> [None] + [p[n] - p[n-1] for n in range(1, len(p))]
[None,
 Timedelta('14 days 00:00:00'),
 Timedelta('16 days 00:00:00'),
 Timedelta('14 days 00:00:00')]

顺便提一下,如果只想获取天数差异:

[None] + [(p[n] - p[n-1]).days for n in range(1, len(p))]
[None, 14, 16, 14]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接