pandas: pandas table 中的日期减去当前日期

pandas: subtracting current date from the date in a pandas table

我正在尝试计算今天与包含历史数据的 pandas 数据之间的天数差异。下面是预期的代码:

df['diff'] = pd.to_datetime( df['date']) - pd.datetime.now().date()

但是,它会产生以下错误:

TypeError: unsupported operand type(s) for -: 'DatetimeIndex' and 'datetime.date'

pandas table 中的日期列如下所示:

0       2018-12-18
1       2018-12-18
2       2018-12-18
3       2018-12-18
4       2018-12-18

如何修复此错误。提前致谢。

您必须减去相同类型 - datetimesdatetime(零次)或 dates 日期.

使用 Timestamp.now with Timestamp.normalize or Timestamp.floor 删除 times:

df['diff'] = pd.to_datetime( df['date']) - pd.Timestamp.now().normalize() 

df['diff'] = pd.to_datetime( df['date']) - pd.Timestamp.now().floor('d')

你也可以使用replace:

dt = pd.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
df['diff'] = pd.to_datetime( df['date']) - dt

或将 Datetimes 转换为 dates 以减去相同类型:

dt = datetime.datetime.now().date()
df['diff'] = pd.to_datetime(df['date']).dt.date - dt

样本:

rng = pd.date_range('2018-04-03', periods=10, freq='100D')
df = pd.DataFrame({'date': rng}) 

df['diff'] = pd.to_datetime( df['date']) - pd.Timestamp.now().normalize() 
print (df)
        date      diff
0 2018-04-03 -261 days
1 2018-07-12 -161 days
2 2018-10-20  -61 days
3 2019-01-28   39 days
4 2019-05-08  139 days
5 2019-08-16  239 days
6 2019-11-24  339 days
7 2020-03-03  439 days
8 2020-06-11  539 days
9 2020-09-19  639 days

有一个微妙但重要的区别。 Pandas 支持 datetime.datetime objects but does not support datetime.date 个对象:

from datetime import date, datetime

# TypeError: unsupported operand type(s) for -: 'DatetimeIndex' and 'datetime.date'
df['date'] - date.today()

# works correctly
df['date'] - datetime.now()

# works correctly
df['date'] - datetime.now().replace(minute=0, hour=0, second=0, microsecond=0)

注意 pd.Timestamp.date returns 一个 datetime.date 对象。文档确实指定了这一点:Return date object with same year, month and daydate 对象 Pandas 以同样的方式支持 datetime 对象。

但是替换时间值很麻烦。您可能更喜欢使用内置的 Pandas 方法进行计算。这些都是等价的:

df['date'] - pd.Timestamp('today').floor('D')
df['date'] - pd.Timestamp.today().normalize()
df['date'] - pd.to_datetime('today').normalize()