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
如何修复此错误。提前致谢。
您必须减去相同类型 - datetimes 与 datetime(零次)或 dates 日期.
使用 Timestamp.now
with Timestamp.normalize
or Timestamp.floor
删除 time
s:
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
转换为 date
s 以减去相同类型:
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 day
。 date
对象 不 Pandas 以同样的方式支持 datetime
对象。
但是替换时间值很麻烦。您可能更喜欢使用内置的 Pandas 方法进行计算。这些都是等价的:
df['date'] - pd.Timestamp('today').floor('D')
df['date'] - pd.Timestamp.today().normalize()
df['date'] - pd.to_datetime('today').normalize()
我正在尝试计算今天与包含历史数据的 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
如何修复此错误。提前致谢。
您必须减去相同类型 - datetimes 与 datetime(零次)或 dates 日期.
使用 Timestamp.now
with Timestamp.normalize
or Timestamp.floor
删除 time
s:
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
转换为 date
s 以减去相同类型:
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 day
。 date
对象 不 Pandas 以同样的方式支持 datetime
对象。
但是替换时间值很麻烦。您可能更喜欢使用内置的 Pandas 方法进行计算。这些都是等价的:
df['date'] - pd.Timestamp('today').floor('D')
df['date'] - pd.Timestamp.today().normalize()
df['date'] - pd.to_datetime('today').normalize()