Python 数据帧中使用日期的列算法

Python 数据帧中使用日期的列算法,python,pandas,dataframe,datetime64,Python,Pandas,Dataframe,Datetime64,我想这应该很容易,但我遇到了点麻烦。我有一个数据集,它是从Stata.dta文件导入到pandas数据帧中的。其中有几列包含日期数据。dataframe包含100000多行,但给出了一个示例: cat event_date total 0 G2 2006-03-08 16 1 G2 NaT NaN 2 G2 NaT NaN 3 G3 2006-03-10 16 4 G3 2006-08-04

我想这应该很容易,但我遇到了点麻烦。我有一个数据集,它是从Stata.dta文件导入到pandas数据帧中的。其中有几列包含日期数据。dataframe包含100000多行,但给出了一个示例:

   cat  event_date  total
0   G2  2006-03-08     16
1   G2         NaT    NaN
2   G2         NaT    NaN
3   G3  2006-03-10     16
4   G3  2006-08-04     12
5   G3  2006-12-28     13
6   G3  2007-05-25     10
7   G4  2006-03-10     13
8   G4  2006-08-06     19
9   G4  2006-12-30     16
数据以datetime64格式存储:

>>> mydata[['cat','event_date','total']].dtypes
cat                    object
event_date     datetime64[ns]
total                 float64
dtype: object
我想做的就是创建一个新的列,给出事件日期和开始日期(比如2006-01-01)之间的天数差(而不是“us”或“ns”!!)。我尝试了以下方法:

>>> mydata['new'] = mydata['event_date'] - np.datetime64('2006-01-01')
……但我明白了:

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
我也尝试过lambda函数,但也不起作用

但是,如果我只想在每个日期加上一天,我就可以成功地使用:

>>> mydata['plusone'] = mydata['event_date'] + np.timedelta64(1,'D')
那很好

我是不是错过了一些简单的东西


提前感谢您的帮助。

不确定为什么numpy
datetime 64
与pandas数据类型不兼容,但使用
datetime
对象对我来说效果很好:

In [39]:

import datetime as dt
mydata['new'] = mydata['event_date'] - dt.datetime(2006,1,1)
mydata
Out[39]:
      cat event_date  total      new
Index                               
0      G2 2006-03-08     16  66 days
1      G2        NaT    NaN      NaT
2      G2        NaT    NaN      NaT
3      G3 2006-03-10     16  68 days
4      G3 2006-08-04     12 215 days
5      G3 2006-12-28     13 361 days
6      G3 2007-05-25     10 509 days
7      G4 2006-03-10     13  68 days
8      G4 2006-08-06     19 217 days
9      G4 2006-12-30     16 363 days

确保您拥有pandas和numpy的最新版本(>=1.7):


你的问题很奇怪,我无法解释,但以下几点对我起了作用:
import datetime as dt mydata['new']=mydata['event\u date']-dt.datetime(2006,1,1)
你能确认我的工作吗?在任何情况下都可以避免直接使用
np.datetime 64
,也就是说,这是一个bug:工作得很好-非常感谢!但我仍然有点困惑——当日期和时间信息以datetime64的形式存储在pandas数据帧中时,这不是一种numpy格式吗?如果是这样的话,为什么datetime起作用而datetime64不起作用?@user1718097这让我很困惑,我没有答案,希望Pandas dev的一条评论刚刚看到Jeff的评论,这是一个bug,应该在未来的版本中修复,你也可以升级;)@user1718097最好将bug直接发布到,而不是在这里,所以,如果你知道这是一个有时候很难分辨的bug,谢谢你的信息-工作非常完美。几乎同时使用dt.datetime()而不是pd.Timestamp()给出了一个非常类似的解决方案。我之所以将该答案标记为已接受,只是因为我在过去更频繁地使用datetime()。但这一解决方案同样有效。
In [11]: df.event_date - pd.Timestamp('2006-01-01')
Out[11]:
0    66 days
1        NaT
2        NaT
3    68 days
4   215 days
5   361 days
6   509 days
7    68 days
8   217 days
9   363 days
Name: event_date, dtype: timedelta64[ns]