панды: вычитание текущей даты из даты в таблице панд - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь вычислить разницу в днях между сегодняшними данными и данными панд, состоящими из исторических данных.Ниже приведен предполагаемый код:

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

Однако выдается следующая ошибка:

TypeError: неподдерживаемые типы операндов для -: 'DatetimeIndex' и 'datetime.date '

Столбец даты в таблице панд выглядит следующим образом:

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

Как исправить эту ошибку.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Есть тонкое, но важное различие.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 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()
0 голосов
/ 20 декабря 2018

Вы должны вычесть одинаковые типы - datetimes с datetime (с нулевым временем) или date с date .

Используйте Timestamp.now с Timestamp.normalize или 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')

Youможно также использовать 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
...