Подтвердить что ты не робот

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 (из-за часа)

4b9b3361

Ответ 1

Используя модуль 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

Ответ 2

Вы можете использовать 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)

Ответ 3

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

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

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

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

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

Ответ 4

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

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