use*_*097 6 python dataframe pandas datetime64
我认为这应该很容易,但我有点像墙了.我有一个数据集从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
Run Code Online (Sandbox Code Playgroud)
数据存储为datetime64格式:
>>> mydata[['cat','event_date','total']].dtypes
cat object
event_date datetime64[ns]
total float64
dtype: object
Run Code Online (Sandbox Code Playgroud)
我想要做的就是创建一个新列,它在event_date和开始日期之间(例如2006-01-01)给出了天数(而不是'us'或'ns'!!!)的差异.我尝试过以下方法:
>>> mydata['new'] = mydata['event_date'] - np.datetime64('2006-01-01')
Run Code Online (Sandbox Code Playgroud)
......但我收到的消息是:
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''
Run Code Online (Sandbox Code Playgroud)
我也尝试了一个lambda函数,但这也不起作用.
但是,如果我想在一天中添加一天,我可以成功使用:
>>> mydata['plusone'] = mydata['event_date'] + np.timedelta64(1,'D')
Run Code Online (Sandbox Code Playgroud)
这很好.
我在这里错过了一些简单的话吗?
在此先感谢您的帮助.
不知道为什么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
Run Code Online (Sandbox Code Playgroud)