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

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

Например;

d1 = date(2001,5,1) d2 = date(2012,1,1) d3 = date(2001,1,1) d4 = date(2012,5,1) diff1 = d2 - d1 diff2 = d4 - d3 

Желаемый результат:

 diff1 == 10 years & 8 months. diff2 == 11 years & 4 months. 

Благодарю.

  • Как добавить еженедельные timedeltas в отношении летних часов
  • Python: Как мне получить время от объекта datetime.timedelta?
  • Как добавить delta в python datetime.time?
  • Python: учитывая дату и день недели, найдите дату следующего появления заданного рабочего дня
  • В чем разница между «datetime.timedelta» и «dateutil.relativedelta.relativedelta» при работе только с днями?
  • Сравнение временной дельта в python
  • Формат Python timedelta более 24 часов для отображения только с часами?
  • Python timedelta: не могу я просто получить в любое время единицы я хочу значение всей разницы?
  • 3 Solutions collect form web for “рассчитать разницу между двумя датами datetime.date () в годах и месяцах”

    Если вы можете установить отличный пакет dateutil , вы можете сделать это:

     >>> 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) >>> "{0.years} years and {0.months} months".format(rd) '10 years and 8 months' 

    В python вычитание двух объектов datetime.date приводит к объекту datetime.timedelta , который имеет атрибут days .

    Невозможно четко определить количество дней разницы в годы и месяцы; если вы определяете год как 365 дней и месяц как 30 дней, вы можете использовать:

     years, remainder = divmod(diff1.days, 365) months = remainder // 30 

    Или вы можете определить средние длины года и месяца (немного) более точно:

     avgyear = 365.2425 # pedants definition of a year length with leap years avgmonth = 365.2425/12.0 # even leap years have 12 months years, remainder = divmod(diff1.days, avgyear) years, months = int(years), int(remainder // avgmonth) 

    При последнем расчете ваше второе различие составляет 11 лет и 3 месяца.

    В объектах timedelta нет информации о месяцах, возможно, вам лучше всего вычислить годы и месяцы напрямую

     >>> d2.year - d1.year + (d2.month - d1.month)/12, (d2.month - d1.month)%12 (10, 8) >>> d4.year - d3.year + (d4.month - d3.month)/12, (d4.month - d3.month)%12 (11, 4) 
    Python - лучший язык программирования в мире.