【问题标题】:pandas: subtracting current date from the date in a pandas table熊猫:从熊猫表中的日期中减去当前日期
【发布时间】:2019-05-20 21:47:21
【问题描述】:

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

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

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

TypeError: 不支持的操作数类型 -: 'DatetimeIndex' 和 '日期时间.日期'

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

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

如何解决此错误。提前致谢。

【问题讨论】:

  • df['diff'] = pd.to_datetime(df['date']) - pd.datetime.now();请试试这个
  • @MadhuriPatel,这是不正确的,因为now 包含时间组件,而这不是 OP 想要的。

标签: python pandas date datetime subtraction


【解决方案1】:

您必须减去相同的类型 - datetimesdatetime(零次)或 datesdate .

使用Timestamp.nowTimestamp.normalizeTimestamp.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

【讨论】:

  • 这不起作用。产生错误:TypeError: cannot convert the series to
  • @Garglesoap 你的 pandas 版本是什么,你失败的代码是什么?
【解决方案2】:

有一个微妙但重要的区别。 Pandas 支持 datetime.datetime 对象,但 支持 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 返回一个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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2015-09-19
    • 1970-01-01
    • 2020-12-30
    • 2018-11-15
    • 2018-08-06
    相关资源
    最近更新 更多