减去熊猫中的日期时间列时返回错误

Posted

技术标签:

【中文标题】减去熊猫中的日期时间列时返回错误【英文标题】:Error returned when subtracting datetime columns in pandas 【发布时间】:2017-11-19 10:54:51 【问题描述】:

我有以下数据框。

  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.

【问题讨论】:

它在我的电脑上运行良好。 在我的情况下,相同的代码不会出错。您使用的是什么版本?或者您可以卸载软件包并重试。 我确实尝试过卸载并重新安装 pandas。结果相同。这是在 Windows 7 上运行的,但我认为这不会有什么不同。 我没有足够的评论点数,但我在 Pandas 18.1 中遇到了同样的错误。有趣的是,如果我选择一行,它就会起作用。没有任何缺失值,所以这是非常奇怪的行为。 datetime dtypes in pandas read_csv的可能重复 【参考方案1】:

我认为这个问题可能已经在更新的 pandas 版本中得到解决(并且可能相关,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 数据框列,它再次正确地转换回 Timestamp 对象。

在我的数据框(大约 90k 行)上,这需要不到 0.01 秒(全部用于在 pandas 中创建一个新列并从 numpy 转换为时间戳),而其他解决方法大约需要 1.5 秒。

【讨论】:

【参考方案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 实现要慢得多叹息

【讨论】:

以上是关于减去熊猫中的日期时间列时返回错误的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:减去两个日期列,结果是一个整数

熊猫逐渐减去日期,直到满足数据帧上的条件

熊猫:增加日期时间

将熊猫数据框中的多列更改为日期时间

日期时间到熊猫系列中的字符串

按日期迭代熊猫数据框的正确方法