Python 数据帧中使用日期的列算法
我想这应该很容易,但我遇到了点麻烦。我有一个数据集,它是从Stata.dta文件导入到pandas数据帧中的。其中有几列包含日期数据。dataframe包含100000多行,但给出了一个示例: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
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]