熊猫:从熊猫表中的日期减去当前日期

时间:2018-12-20 11:12:21

标签: python pandas date datetime subtraction

我正在尝试计算今天和由历史数据组成的熊猫数据之间的天数差。下面是预期的代码:

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

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

  

TypeError:-:“ DatetimeIndex”和以下不支持的操作数类型   'datetime.date'

pandas表中的日期列如下:

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

如何解决此错误。预先感谢。

2 个答案:

答案 0 :(得分:1)

您必须减去相同的类型-日期时间日期时间(零次)或日期日期

Timestamp.nowTimestamp.normalizeTimestamp.floor一起使用,以删除time

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以减去相同的类型:

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

答案 1 :(得分:1)

有一个细微但重要的区别。熊猫支持 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 day。熊猫本身不支持date对象{strong> ,就像支持datetime对象一样。

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

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