熊猫的负时差
Posted
技术标签:
【中文标题】熊猫的负时差【英文标题】:Negative time difference in Pandas 【发布时间】:2021-08-10 17:38:57 【问题描述】:我通过将较早的时间戳减去后面的时间戳得到这个奇怪的结果:
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')
计算负时差的正确方法是什么?谢谢!
【问题讨论】:
请用 pandas 版本更新您的问题 你期待什么结果? @Umar.H 我的意思是我希望 - 2 分钟,而不是 - 2 天。 这给出了正确的输出......你的结果是Timedelta('-1 days +23:58:00')
等于-24:00:00 + 23:58:00
=> 2 mins
@MykolaZotko.. 我就是这么做的
【参考方案1】:
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
,但单个时间元素不能超过它们的模数。 timedelta 分量被归一化。为了表示负 2 分钟,使用负日期和正时间分量。
from the python datetime module's documentation
然后对天、秒和微秒进行归一化,以便表示是唯一的,其中
0 0 -999999999
请注意,负值的标准化起初可能会令人惊讶。例如:
from datetime import timedelta
d = timedelta(microseconds=-1)
(d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
可以使用 Timedelta.total_seconds
方法将总秒数检索为负整数
【讨论】:
【参考方案2】:我们可以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
【讨论】:
能否解释一下默认行为。 我可以想象会发生这样的事情:timedelta 对象计算完整的一天,然后将小时数:分钟:秒添加到该值。这在技术上是正确的,但很难看。只是一个观察。【参考方案3】:使用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')
【讨论】:
请注意,这是不正确的增量,OP 很好奇如何将增量表示为0 days -00:02:00'
【参考方案4】:
你的代码给出了正确的输出......
你的结果是Timedelta('-1 days +23:58:00')
等于-24:00:00 + 23:58:00
=> 2 mins
【讨论】:
【参考方案5】:您可以使用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
【讨论】:
以上是关于熊猫的负时差的主要内容,如果未能解决你的问题,请参考以下文章