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