Как получить разницу между двумя датами в годах, месяцах и днях?

Есть две даты:

date1 = 20201231
date2 = 20311105

Как получить разницу между ними в виде:

d_years = date2-date1
d_months = date2-date1
d_days = date2-date1
print(f'delta : \n in days {d_days}\n in months {d_months}\n in years {d_years}')

Ответы (1 шт):

Автор решения: MaxU

Воспользуйтесь удобным модулем dateutil:

from dateutil.parser import parse as du_parse
from dateutil.relativedelta import relativedelta

d1 = du_parse(str(date1))
d2 = du_parse(str(date2))
delta = relativedelta(d2, d1)

In [14]: delta.years
Out[14]: 10

In [15]: delta.months
Out[15]: 10

In [16]: delta.days
Out[16]: 5

общее число месяцев:

In [76]: delta.years * 12 + delta.months
Out[76]: 130

точное общее число дней - для этого достаточно воспользоваться атрибутом .days от разницы дат:

In [78]: (d2 - d1).days
Out[78]: 3961

Примеры использования парсера:

In [68]: du_parse('20200509')
Out[68]: datetime.datetime(2020, 5, 9, 0, 0)

In [69]: du_parse('2020-05-09')
Out[69]: datetime.datetime(2020, 5, 9, 0, 0)

In [70]: du_parse('2020/05/09 11:12:13')
Out[70]: datetime.datetime(2020, 5, 9, 11, 12, 13)

In [71]: du_parse('Tuesday 5 May 2020')
Out[71]: datetime.datetime(2020, 5, 5, 0, 0)

По умолчанию, если первое число <=12, то оно воспринимается как месяц, т.е. из 09.05.2020 - получим 5 сентября 2020:

In [72]: du_parse('09.05.2020')
Out[72]: datetime.datetime(2020, 9, 5, 0, 0)

Можно явно указать, что первое число - это дни:

In [74]: du_parse('09.05.2020', dayfirst=True)
Out[74]: datetime.datetime(2020, 5, 9, 0, 0)
→ Ссылка