我有一个pandas数据帧navTable,其索引是一系列日期。
我需要找到索引
中连续日期之间的差异 Delta
2016-08-10 0.006619
2016-08-12 0.006595
2016-08-14 0.006595
2016-08-17 0.006595
2016-08-18 0.006595
我想要一个新列Days_Diff
,这会让我在后续日期(索引中)有所不同。因此我的输出应该是这样的
Delta Delta_Days
8/10/2016 0.006619 None
8/12/2016 0.006595 2
8/14/2016 0.006595 2
8/17/2016 0.006595 3
8/18/2016 0.006595 1
我先试了这个:
navTable['Index'] = navTable.index
navTable['Days_Diff'] = navTable['Index'] - navTable['Index'].shift(1)
navTable['Delta_Days'] = navTable['Days_Diff'].days
Outright,这不被接受,因为它抱怨“天不能应用于系列赛”
所以,我试过这个:
navTable['Index'] = navTable.index
navTable['Days_Diff'] = navTable['Index'] - navTable['Index'].shift(1)
navTable['Delta_Days'] = [ eachDayDiff.days for eachDayDiff in list(dataTable['Days_Diff']) ]
可以理解的是,它抱怨第一个元素是Null
。
'NaTType'对象没有属性'days'
问题1)我是否有效地处理了这种情况? 问题2)如何解决
'NaTType'对象没有属性'days'
对于记录,第一个元素是pandas.tslib.NaTType
类型
其余类型为pandas.tslib.Timedelta
修改:格式化
答案 0 :(得分:2)
通常,您将使用diff()
函数计算相邻差异,您可以将索引转换为普通系列,然后使用diff()
函数,该函数提供一系列time delta
数据类型:
df.index.to_series().diff()
# 2016-08-10 NaT
# 2016-08-12 2 days
# 2016-08-14 2 days
# 2016-08-17 3 days
# 2016-08-18 1 days
# dtype: timedelta64[ns]
将时间增量数据类型转换为数字类型:
import numpy as np
df['Delta_Days'] = (df.index.to_series().diff() / np.timedelta64(1, 'D')).astype(float)
df
# Delta Delta_Days
#2016-08-10 0.006619 NaN
#2016-08-12 0.006595 2.0
#2016-08-14 0.006595 2.0
#2016-08-17 0.006595 3.0
#2016-08-18 0.006595 1.0