Pandas 中的负时差

Negative time difference in Pandas

我通过将较早的时间戳减去较晚的时间戳得到了这个奇怪的结果:

pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')

输出:

Timedelta('-1 days +23:58:00')

预期输出:

Timedelta('-0 days 00:02:00')

计算负时差的正确方法是什么?谢谢!

我们可以total_seconds

(pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')).total_seconds()
Out[9]: -120.0

使用abs获取时间增量:

>>> abs(pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00'))
Timedelta('0 days 00:02:00')

Timedelta('-1 days +23:58:00') pandas(以及纯python)

中负时差的正确表示]
# using pure python
from datetime import datetime
datetime(2021,5,21,6,0,0) - datetime(2021,5,21,6,2,0)
datetime.timedelta(days=-1, seconds=86280)

这是因为差异被正确计算为 -120 seconds,但各个时间元素不能超过它们的 moduli。 timedelta 组件被归一化。为了表示负 2 分钟,使用负日和正时间分量。

from the python datetime module's documentation

and days, seconds and microseconds are then normalized so that the representation is unique, with

  • 0 <= microseconds < 1000000
  • 0 <= seconds < 3600*24 (the number of seconds in one day)
  • -999999999 <= days <= 999999999

Note that normalization of negative values may be surprising at first. For example:

from datetime import timedelta
d = timedelta(microseconds=-1)
(d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)

可以使用 Timedelta.total_seconds

方法将总秒数检索为负整数

好吧,您的代码给出了正确的输出... 你的结果是 Timedelta('-1 days +23:58:00') 等于 -24:00:00 + 23:58:00 => 2 mins

您可以使用 np.timedelta64 将时间增量更改为您想要的输出

正如其他人所说,pandas 否定 Timedelta 对象是 python 中的正确输出。

import numpy as np
delta = pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')


print(delta)
Timedelta('-1 days +23:58:00')

#minutes
print(delta / np.timedelta64(1,'m')
-2.0
#seconds
delta / np.timedelta64(1,'s')
-120.0