Python: différence de 2 datetimes en mois [dupliquer]

possible Duplicate:

la meilleure façon de trouver les mois entre deux dates (en python)

je voudrais savoir comment je peux avoir le nombre exact de mois de cette différence:

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 résultats dans

datetime.timedelta(183, 43200)

je voudrais savoir le nombre exact de mois, dans ce cas, il doit retour 5 et non 6 (à cause de l'heure)

33
demandé sur Community 2011-08-10 22:04:30

4 réponses

avec le module calendar pour connaître le nombre de jours par mois, vous pouvez simplement compter les mois.

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
22
répondu Senko Rašić 2011-08-10 18:20:29

vous pouvez utiliser 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)
61
répondu sandinmyjoints 2011-08-10 18:18:09

vous seul connaissez les exigences que vous devez respecter, mais le fait qu'il y ait 183 jours et 43200 secondes SI entre ces deux dates souligne une subjectivité inhérente dans la détermination du nombre de mois que "vraiment" est.

Est un mois de 30 jours, ou (365 / 12) jours, ou ((365 * 4 + 1) / 48) jours, ou ...?

est un jour Toujours 86400 secondes, ou comptez-vous les secondes historiques de saut, ou prévoyez-vous les secondes de saut pour les dates futures?

ces décisions affectent la réponse que l'algorithme que vous semblez vouloir vous donnera pour certaines dates d'entrée qui sont proches de ces limites.

À mon avis, il est plus intuitif de considérer mois comme des unités atomiques de temps, et d'utiliser cette formule: (date2.year - date1.year) * 12 + (date2.month - date1.month)

18
répondu wberry 2011-08-10 18:22:48

l'avantage de le faire de cette façon est qu'il y a peu de dépendances de module et pas de boucle -- les mois peuvent être trouvés par le calcul simple.

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
répondu unutbu 2011-08-10 21:21:23