使用日期在pandas数据框中进行列算术运算

6 投票
2 回答
4002 浏览
提问于 2025-04-18 16:55

我觉得这应该很简单,但我遇到了一些问题。我有一个数据集,是从一个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

撰写回答