这个问题“被问了很多” - 但在仔细查看其他答案后,我还没有找到适用于我案例的解决方案。遗憾的是,这仍然是一个棘手的问题。
我有一个pandas
数据框,其中包含datetime
列,我只想计算数据所涵盖的时间范围(以秒为单位)。
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]
为什么不(a)工作?
为什么(b)需要呢? (它还提供单元素numpy
数组而不是timedelta
对象)
我的熊猫版本为0.20.3
,它排除了早期已知的错误。
这是动态范围问题吗?
答案 0 :(得分: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