web-dev-qa-db-ja.com

Python:月の2つの日付時刻の差

可能性のある複製:
Pythonで)2つの日付間の月を見つける最良の方法

この違いに対して正確な月数をどのように取得できるかを知りたい:

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)

正確な月数を知りたいのですが、この場合は6時間ではなく5を返す必要があります

37
Tiago Moutinho

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
24
Senko Rašić

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)
70
sandinmyjoints

満たす必要のある要件を知っているのはあなただけですが、これら2つの日付の間に183日と43200 SI秒があるという事実は、「本当に」何ヶ月あるかを決定する固有の主観を強調しています。

月は30日、または(365/12)日、または((365 * 4 + 1)/ 48)日、または...?

1日は常に86400秒ですか、それとも過去のうるう秒をカウントしますか、それとも将来の日付のうるう秒を予測しますか?

これらの決定は、あなたが望むように見えるアルゴリズムがこれらの境界に近い特定の入力日付に対してあなたに与える答えに影響します。

私の意見では、この目的のために月を原子の時間単位とみなし、次の式を使用する方が直感的です。(date2.year - date1.year) * 12 + (date2.month - date1.month)

22
wberry

この方法で行うことの利点は、モジュールの依存関係がほとんどなく、ループが発生しないことです。つまり、月は直接計算によって見つけることができます。

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
5
unutbu