【问题标题】:Pandas: Difference of of two datetime64 objects yields NaT rather than correct timedelta valuePandas:两个 datetime64 对象的差异产生 NaT 而不是正确的 timedelta 值
【发布时间】:2017-10-13 21:00:50
【问题描述】:

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

我有一个带有 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,排除了早期已知的错误。

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

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    不同的索引有问题,所以一个项目系列无法对齐并获取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
    

    【讨论】:

    • 我喜欢你提供的选项。还有 df.get_value() : df.get_value(len(df)-1,'datetime') - df.get_value(0,'datetime')
    • 第一个 - 只是为我工作了两个系列的差异 - 非常感谢! :)
    猜你喜欢
    • 2016-08-31
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2021-11-19
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多