(Python 2.7,Pandas 0.9)
这似乎是一件简单的事情,但我无法弄清楚如何使用Pandas计算数据框中两个日期列之间的差异。此数据帧已经有一个索引,因此不希望将任何列放入DateTimeIndex。
要从我使用的字符串转换每个日期列:
data.Date_Column = pd.to_datetime(data.Date_Column)
从那里,为了获得两列之间的经过时间,我做:
data.Closed_Date - data.Created_Date
返回错误:
TypeError: %d format: a number is required, not a numpy.timedelta64
检查两列上的dtypes会产生datetime64 [ns],并且数组中的各个日期都是类型时间戳。
我错过了什么?
编辑:
这是一个例子,我可以创建单独的DateTimeIndex对象并完成我想要的,但是当我尝试在数据帧的上下文中执行它时,它会失败。
Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
Closed_Date = pd.DatetimeIndex(data['Closed_Date'], copy=True)
Closed_Date.day - Created_Date.day
[Out] array([ -3, -16, 5, ..., 0, 0, 0])
现在相同但在数据框中:
data.Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
data.Closed_Date = pd.DatetimeIndex(data.Closed_Date, copy=True)
data.Created_Date.day - data.Created_Date.day
AttributeError: 'Series' object has no attribute 'day'
以下是一些数据,如果你想玩它:
data['Created Date'][0:10].to_dict()
{0: '1/1/2009 0:00',
1: '1/1/2009 0:00',
2: '1/1/2009 0:00',
3: '1/1/2009 0:00',
4: '1/1/2009 0:00',
5: '1/1/2009 0:00',
6: '1/1/2009 0:00',
7: '1/1/2009 0:00',
8: '1/1/2009 0:00',
9: '1/1/2009 0:00'}
data['Closed Date'][0:10].to_dict()
{0: '1/7/2009 0:00',
1: nan,
2: '1/1/2009 0:00',
3: '1/1/2009 0:00',
4: '1/1/2009 0:00',
5: '1/12/2009 0:00',
6: '1/12/2009 0:00',
7: '1/7/2009 0:00',
8: '1/10/2009 0:00',
9: '1/7/2009 0:00'}
答案 0 :(得分:6)
更新:一个有用的解决方法是使用DatetimeIndex构造函数(通常比应用程序快得多)粉碎它,例如:
DatetimeIndex(df['Created_Date']).day
在0.15中,这将在dt属性(以及其他日期时间方法)中可用:
df['Created_Date'].dt.day
你的错误是语法,虽然人们可能希望它能起作用,但它不会:
data.Created_Date.day - data.Created_Date.day
AttributeError: 'Series' object has no attribute 'day'
如果选择更复杂的选项,您可以使用apply
:
In [111]: df['sub'] = df.apply(lambda x: x['Created_Date'].day - x['Closed_Date'].day, axis=1)
In [112]: df[['Created_Date','Closed_Date','sub']]
Out[112]:
Created_Date Closed_Date sub
0 2009-01-07 00:00:00 2009-01-01 00:00:00 6
1 NaT 2009-01-01 00:00:00 9
2 2009-01-01 00:00:00 2009-01-01 00:00:00 0
3 2009-01-01 00:00:00 2009-01-01 00:00:00 0
4 2009-01-01 00:00:00 2009-01-01 00:00:00 0
5 2009-01-12 00:00:00 2009-01-01 00:00:00 11
6 2009-01-12 00:00:00 2009-01-01 00:00:00 11
7 2009-01-07 00:00:00 2009-01-01 00:00:00 6
8 2009-01-10 00:00:00 2009-01-01 00:00:00 9
9 2009-01-07 00:00:00 2009-01-01 00:00:00 6
警惕,你可能应该分别对这些NaT
做一些事情:
In [114]: df.ix[1][1].day # NaT.day
Out[114]: -1
。
注意:在使用.days
的timedelta上使用NaT
时出现类似的奇怪行为:
In [115]: df['sub2'] = df.apply(lambda x: (x['a'] - x['b']).days, axis=1)
In [116]: df['sub2'][1]
Out[116]: 92505