Найти разницу между двумя датами в годах, а остаток выражается в днях в Python - PullRequest
0 голосов
/ 09 октября 2019

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

Пример 1 : еслидве даты - June 1, 1981 и August 23, 2001,, тогда результат должен быть 20 years and 83 days.

Пример 2 : если двадаты - January 1, 2002 и December 30, 2003,, тогда результат должен быть 1 year and 363 days.

Меня не касается форматирование результатов;Мне просто нужно знать самый Pythonic способ подсчета количества лет и дней.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Используя datetime, встроенный модуль, вы можете легко получить количество дней.

>>> import datetime

>>> foo = datetime.date(2001, 8, 23) - datetime.date(1981, 6, 1)
>>> foo
datetime.timedelta(days=7388)
>>> foo.days
7388

>>> bar = datetime.date(2003, 12, 30) - datetime.date(2002, 1, 1)
>>> bar
datetime.timedelta(days=728)
>>> bar.days
728

Модуль dateutil может указывать количество лет, но количество месяцев

>>> import datetime
>>> from dateutil.relativedelta import relativedelta

>>> relativedelta(datetime.date(2001, 8, 23), datetime.date(1981, 6, 1))
relativedelta(years=+20, months=+2, days=+22)

>>> relativedelta(datetime.date(2003, 12, 30), datetime.date(2002, 1, 1))
relativedelta(years=+1, months=+11, days=+29)

Будьте осторожны при использовании количества месяцев. Месяц не определяется так же, как день. 11 месяцев в предыдущем примере представляют собой сочетание шести 31-дневных месяцев, четырех 30-дневных месяцев и одного 28-дневного месяца. Таким образом, вы не можете использовать его для получения количества дней. Я рекомендую написать функцию, чтобы получить разницу в нужной форме.

import calendar
import datetime
from dateutil.relativedelta import relativedelta

def get_delta(date2, date1):
    '''calculate the delta between two datetime.date objects (date2 the newer date)'''

    number_of_leap_years = sum(1
                               for yr in range(date1.year, date2.year + 1)
                               if calendar.isleap(yr))
    number_of_years = relativedelta(date2, date1).years

    total_number_of_days = (date2 - date1).days
    number_of_days = total_number_of_days
                     - 365 * number_of_years
                     - number_of_leap_years

    return f'{number_of_years} years, {number_of_days} days'
0 голосов
/ 09 октября 2019

Вам нужно будет использовать модули datetime иlativedelta.

import datetime
from dateutil.relativedelta import relativedelta

start_date = datetime.datetime(1981,6,1)
end_date = datetime.datetime(2002,1,1)

difference_in_years = relativedelta(end_date, start_date)
print(difference_in_years)
...