在pandas中减去datetime列时返回错误

时间:2017-06-16 15:32:55

标签: python pandas datetime timedelta

我有以下数据框。

  Date Returned Start Date
0    2017-06-02 2017-04-01
1    2017-06-02 2017-04-01
2    2017-06-02 2017-04-01
3    2017-06-02 2017-02-28
4    2017-06-02 2017-02-28
5    2017-06-02 2016-07-20
6    2017-06-02 2016-07-20

两列都是datetime64类型。

subframe[['Date Returned','Start Date']].dtypes
Out[9]: 
Date Returned    datetime64[ns]
Start Date       datetime64[ns]
dtype: object

然而,当我试图找到两列日期之间的时间间隔时,我得到了这个错误。

subframe['Delta']=subframe['Date Returned'] - subframe['Start Date']

TypeError: data type "datetime" not understood 

有解决方法吗?我已经尝试了所有我能想到的东西,并且此时已将大部分头发拉出来。任何帮助是极大的赞赏。 I did find someone posting the same problem, but no one really answered it.

2 个答案:

答案 0 :(得分:3)

我认为这个问题可能已经在最近的熊猫版本中解决了(也许是相关的,numpy),也许它一直是特定于Windows的。但是,在我正在研究的计算机上(pandas 0.18.0,numpy 1.13,在Windows 7下)它还没有解决。

对于与我情况相同的人,有一种解决方法比@ blacksite的工作速度快得多:

subframe['Delta'] = subframe['Date Returned'].values - subframe['Start Date'].values

看起来很傻,把“.values”转换成Numpy datetime64对象,正确地减去它们。将它分配给pandas Data Frame列,它再次正确地转换回Timestamp对象。

在我的数据帧(大约90k行)上,这需要不到0.01秒(所有用于在pandas中创建新列并从numpy转换为Timestamp),而另一个解决方法需要大约1.5秒。

答案 1 :(得分:2)

我在pandas 0.18.1中收到了同样的错误。这是一种解决方法,迭代地对各个起始端对进行操作:

d['diff'] = [ret - start for start, ret in zip(d['Start'], d['Returned'])]

d现在是:

Returned      Start     diff
0 2017-06-02 2017-04-01  62 days
1 2017-06-02 2017-04-01  62 days
2 2017-06-02 2017-04-01  62 days
3 2017-06-02 2017-02-28  94 days
4 2017-06-02 2017-02-28  94 days
5 2017-06-02 2016-07-20 317 days
6 2017-06-02 2016-07-20 317 days

这种解决方法很多比我想象的本机pandas实现速度慢。 叹息