使用日期在pandas数据框中进行列算术运算
我觉得这应该很简单,但我遇到了一些问题。我有一个数据集,是从一个Stata的.dta文件导入到pandas的dataframe中的。这个dataframe里有很多列包含日期数据。虽然这个dataframe有超过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
我想做的就是创建一个新列,计算事件日期和一个起始日期(比如2006年1月1日)之间的天数差(而不是'微秒'或'纳秒'!!!)。我试过以下方法:
>>> 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')
这样是可以的。
我是不是漏掉了什么简单的东西呢?
提前感谢任何帮助。
2 个回答
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]
6
我不太明白为什么numpy里的datetime64
和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