我认为这应该很容易,但我碰到了一堵墙。我有一个数据集从Stata .dta文件导入到pandas数据框中。其中一些列包含日期数据。数据框包含100,000多行,但提供了一个样本:
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
我想要做的就是创建一个新列,它在event_date和start之间提供天数(而不是' us'或' !!!)的差异日期,比如说2006-01-01。我尝试过以下方法:
>>> 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')
工作正常。
我在这里错过了一些直截了当的东西吗?
提前感谢您的帮助。
答案 0 :(得分:6)
不确定为什么numpy datetime64
与pandas dtypes不兼容,但使用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
答案 1 :(得分:2)
确保您拥有最新版本的pandas和numpy(> = 1.7):
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]