Python: разница в 2 днях в месяцах

Возможный дубликат:
Лучший способ найти месяцы между двумя датами (в python)

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

date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') 

date2-date1 приводит к

 datetime.timedelta(183, 43200) 

Я хотел бы узнать точное количество месяцев, в этом случае он должен вернуть 5, а не 6 (из-за часа)

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

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

     from calendar import monthrange from datetime import datetime, timedelta def monthdelta(d1, d2): delta = 0 while True: mdays = monthrange(d1.year, d1.month)[1] d1 += timedelta(days=mdays) if d1 <= d2: delta += 1 else: break return delta 

    Вы можете использовать python-dateutil .

     In [4]: from datetime import datetime In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') In [7]: from dateutil import relativedelta In [8]: r = relativedelta.relativedelta(date1, date2) In [9]: r Out[9]: relativedelta(months=-5, days=-30, hours=-12) 

    Только вы знаете требования, которые вы должны выполнить, но тот факт, что есть 183 дня и 43200 секунд SI между этими двумя датами, подчеркивает присущую субъективность в определении того, сколько месяцев это «действительно».

    Является ли месяц 30 дней или (365/12) дней или ((365 * 4 + 1) / 48) дней или …?

    Является ли день всегда 86400 секунд, или вы считаете исторические прыжки секунд, или вы прогнозируете секунды прыжка для будущих дат?

    Эти решения влияют на ответ, который, по вашему мнению, вам даст, даст вам определенные даты ввода, близкие к этим границам.

    На мой взгляд, более интуитивно рассмотреть месяцы как атомные единицы времени для этой цели и использовать эту формулу: (date2.year - date1.year) * 12 + (date2.month - date1.month)

    Преимущество этого заключается в том, что существует несколько зависимостей модулей и отсутствие циклов – месяцы могут быть найдены прямым вычислением.

     import datetime as dt def months_between(date1,date2): if date1>date2: date1,date2=date2,date1 m1=date1.year*12+date1.month m2=date2.year*12+date2.month months=m2-m1 if date1.day>date2.day: months-=1 elif date1.day==date2.day: seconds1=date1.hour*3600+date1.minute+date1.second seconds2=date2.hour*3600+date2.minute+date2.second if seconds1>seconds2: months-=1 return months date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') date2 = dt.datetime.strptime('2012-02-15', '%Y-%m-%d') print(months_between(date1,date2)) # 5 date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') date2 = dt.datetime.strptime('2012-02-15 11:59:00', '%Y-%m-%d %X') print(months_between(date1,date2)) # 5 date2 = dt.datetime.strptime('2012-02-15 12:00:00', '%Y-%m-%d %X') print(months_between(date1,date2)) # 6 date2 = dt.datetime.strptime('2012-02-15 12:00:01', '%Y-%m-%d %X') print(months_between(date1,date2)) # 6 
    Python - лучший язык программирования в мире.