Python: Diferencia de 2 tiempos de datos en meses

Posible duplicado:
La mejor manera de encontrar los meses entre dos fechas (en python)

Me gustaría saber cómo puedo tener la cantidad exacta de meses para esta diferencia:

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 resultados en

 datetime.timedelta(183, 43200) 

Me gustaría saber la cantidad exacta de meses, en este caso debería devolver 5 y no 6 (debido a la hora)

Usando el módulo de calendar para averiguar cuántos días tiene cada mes, simplemente puede contar los meses.

 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 

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

Solo usted conoce los requisitos que debe cumplir, pero el hecho de que haya 183 días y 43200 segundos de SI entre estas dos fechas resalta una subjetividad inherente al determinar cuántos meses es “realmente”.

¿Es un mes 30 días, o (365/12) días, o ((365 * 4 + 1) / 48) días, o …?

¿Es un día siempre 86400 segundos, o cuenta los segundos de salto históricos, o predice los segundos de salto para fechas futuras?

Estas decisiones afectan la respuesta que el algoritmo que parece desear le dará para ciertas fechas de entrada cercanas a estos límites.

En mi opinión, es más intuitivo considerar los meses como unidades atómicas de tiempo para este propósito y usar esta fórmula: (date2.year - date1.year) * 12 + (date2.month - date1.month)

La ventaja de hacerlo de esta manera es que hay pocas dependencias de módulos y ningún bucle; los meses se pueden encontrar por cálculo directo.

 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