Python:以月为单位的2个日期时间的差异

时间:2011-08-10 18:04:31

标签: python date datediff timedelta

  

可能重复:
  Best way to find the months between two dates (in 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(因为小时)

4 个答案:

答案 0 :(得分:68)

您可以使用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)

答案 1 :(得分:23)

使用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 :(得分:19)

只有你知道你必须满足的要求,但这两个日期之间有183天和43200 SI秒这一事实强调了确定“真正”有多少个月的固有主观性。

是一个月30天,或(365/12)天,或((365 * 4 + 1)/ 48)天,还是......?

一天总是86400秒,还是计算历史闰秒,还是预测未来日期的闰秒?

这些决定会影响答案,您希望算法可以为您提供接近这些边界的特定输入日期。

在我看来,为了这个目的,将月份视为原子时间单位更为直观,并使用以下公式:(date2.year - date1.year) * 12 + (date2.month - date1.month)

答案 3 :(得分:5)

这样做的好处是模块依赖性很少而且没有循环 - 可以通过直接计算找到月份。

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