Как найти разницу между двумя датами в годах - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть два столбца в моем фрейме данных, которые я преобразовал в datetime.Я пытаюсь вычесть эти цифры и найти разницу в годах.Это код, который я использую:

from dateutil.relativedelta import relativedelta
difference_in_years = relativedelta(x['start'], x['end']).year

Однако я получаю следующее сообщение об ошибке:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

В чем проблема?

Ответы [ 4 ]

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

Вы можете разделить ряды timedelta на единицы года и, если необходимо, округлить:

# data from jezrael

df['years'] = (df['end'] - df['start']) / np.timedelta64(1, 'Y')
df['years_floor'] = df['years'].round()

print(df)

       start        end     years  years_floor
0 2015-10-02 2018-01-02  2.253297          2.0
1 2014-11-05        NaT       NaN          NaN
0 голосов
/ 08 декабря 2018

Проверьте этот ответ рассчитайте разницу между двумя датами datetime.date () в годах и месяцах

from dateutil import relativedelta as rdelta
from datetime import date
d1 = date(2001,5,1)
d2 = date(2012,1,1)
rd = rdelta.relativedelta(d2,d1)
rd
relativedelta(years=+10, months=+8)
0 голосов
/ 08 декабря 2018

Вы можете сделать это по

(df['end'] - df['start'])/pd.Timedelta(1, 'Y')

и округлить результат, если необходимо.

В пандах v0.23.4 и позже вы можете сделать

(df['end'] - df['start'])//pd.Timedelta(1, 'Y')

дополучите разницу в течение всего года.

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

Используйте атрибут .years с apply и axis=1 для обработки по строкам:

df = pd.DataFrame({'start':['2015-10-02','2014-11-05'],
                   'end':['2018-01-02','2018-10-05']})

df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

from dateutil.relativedelta import relativedelta

df['y'] = df.apply(lambda x: relativedelta(x['end'], x['start']).years, axis=1)

Или используйте list comprehension:

df['y'] = [relativedelta(i, j).years for i, j in zip(df['end'], df['start'])]

print (df)
       start        end  y
0 2015-10-02 2018-01-02  2
1 2014-11-05 2018-10-05  3

РЕДАКТИРОВАТЬ:

df = pd.DataFrame({'start':['2015-10-02','2014-11-05'],
                   'end':['2018-01-02',np.nan]})

df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

from dateutil.relativedelta import relativedelta

m = df[['start','end']].notnull().all(axis=1)
df.loc[m, 'y'] = df[m].apply(lambda x: relativedelta(x['end'], x['start']).years, axis=1)
print (df)
       start        end    y
0 2015-10-02 2018-01-02  2.0
1 2014-11-05        NaT  NaN
...