gpt4 book ai didi

python - Pandas :两个 datetime64 对象的差异产生 NaT 而不是正确的 timedelta 值

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:21 25 4
gpt4 key购买 nike

这个问题“被问了很多”——但在仔细查看其他答案后,我还没有找到适合我的情况的解决方案。很遗憾,这仍然是一个症结所在。

我有一个包含 datetime 列的 pandas 数据框,我只想计算数据覆盖的时间范围,以秒为单位(比方说)。

from datetime import datetime

# You can create fake datetime entries any way you like, e.g.
df = pd.DataFrame({'datetime': pd.date_range('10/1/2001 10:00:00', \
periods=3, freq='10H'),'B':[4,5,6]})

# (a) This yields NaT:
timespan_a=df['datetime'][-1:]-df['datetime'][:1]
print timespan_a
# 0 NaT
# 2 NaT
# Name: datetime, dtype: timedelta64[ns]

# (b) This does work - but why?
timespan_b=df['datetime'][-1:].values.astype("timedelta64")-\
df['datetime'][:1].values.astype("timedelta64")
print timespan_b
# [72000000000000]
  1. 为什么 (a) 不起作用?

  2. 为什么需要 (b) 而不是? (它还给出了一个单元素 numpy 数组而不是一个 timedelta 对象)

我的 pandas 版本为 0.20.3,这排除了一个较早的已知错误。

这是一个动态范围问题吗?

最佳答案

有不同索引的问题,所以一个项目系列无法对齐并得到NaT

解决方案是通过 values 将第一个或第二个值转换为 numpy 数组:

timespan_a = df['datetime'][-1:]-df['datetime'][:1].values
print (timespan_a)
2 20:00:00
Name: datetime, dtype: timedelta64[ns]

或者将两个索引值设置为相同:

a = df['datetime'][-1:]
b = df['datetime'][:1]
print (a)
2 2001-10-02 06:00:00
Name: datetime, dtype: datetime64[ns]

a.index = b.index
print (a)
0 2001-10-02 06:00:00
Name: datetime, dtype: datetime64[ns]
print (b)
0 2001-10-01 10:00:00
Name: datetime, dtype: datetime64[ns]

timespan_a = a - b
print (timespan_a)
0 20:00:00
Name: datetime, dtype: timedelta64[ns]

如果想使用标量:

a = df.loc[df.index[-1], 'datetime']
b = df.loc[0, 'datetime']
print (a)
2001-10-02 06:00:00

print (b)
2001-10-01 10:00:00

timespan_a = a - b
print (timespan_a)
0 days 20:00:00

另一种解决方法,谢谢Anton vBR :

timespan_a = df.get_value(len(df)-1,'datetime')- df.get_value(0,'datetime') 
print (timespan_a)
0 days 20:00:00

关于python - Pandas :两个 datetime64 对象的差异产生 NaT 而不是正确的 timedelta 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46730272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com