Pandas中日期序列(不是索引)的算术

Chr*_*ong 4 python pandas

(Python 2.7,Pandas 0.9)

这似乎是一件简单的事情,但我无法弄清楚如何使用Pandas计算数据框中两个日期列之间的差异.此数据帧已经有一个索引,因此不希望将任何列放入DateTimeIndex.

要从我使用的字符串转换每个日期列:

data.Date_Column = pd.to_datetime(data.Date_Column)
Run Code Online (Sandbox Code Playgroud)

从那里,为了获得两列之间的经过时间,我做:

data.Closed_Date - data.Created_Date 
Run Code Online (Sandbox Code Playgroud)

返回错误:

TypeError: %d format: a number is required, not a numpy.timedelta64
Run Code Online (Sandbox Code Playgroud)

检查两列上的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])
Run Code Online (Sandbox Code Playgroud)

现在相同但在数据帧中:

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'
Run Code Online (Sandbox Code Playgroud)

如果你想玩它,这里有一些数据:

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'}
Run Code Online (Sandbox Code Playgroud)

And*_*den 6

更新:一个有用的解决方法是使用DatetimeIndex构造函数(通常比应用程序快得多)粉碎它,例如:

DatetimeIndex(df['Created_Date']).day
Run Code Online (Sandbox Code Playgroud)

在0.15中,这将在dt属性(以及其他日期时间方法)中可用:

df['Created_Date'].dt.day
Run Code Online (Sandbox Code Playgroud)

你的错误是语法,虽然人们可能希望它能起作用但它不会:

data.Created_Date.day - data.Created_Date.day
AttributeError: 'Series' object has no attribute 'day'
Run Code Online (Sandbox Code Playgroud)

对于像这样的更复杂的选择,您可以使用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
Run Code Online (Sandbox Code Playgroud)

要小心,你可能应该分别用这些东西做点什么NaT:

In [114]: df.ix[1][1].day # NaT.day
Out[114]: -1
Run Code Online (Sandbox Code Playgroud)

.

注意:.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
Run Code Online (Sandbox Code Playgroud)