Quiero calcular la diferencia entre dos fechas datetime.date () en años y meses.
Por ejemplo;
d1 = date(2001,5,1) d2 = date(2012,1,1) d3 = date(2001,1,1) d4 = date(2012,5,1) diff1 = d2 - d1 diff2 = d4 - d3
Resultado deseado:
diff1 == 10 years & 8 months. diff2 == 11 years & 4 months.
Gracias.
Si puede instalar el excelente paquete dateutil , puede hacer esto:
>>> from dateutil import relativedelta as rdelta >>> from datetime import date >>> d1 = date(2001,5,1) >>> d2 = date(2012,1,1) >>> rd = rdelta.relativedelta(d2,d1) >>> "{0.years} years and {0.months} months".format(rd) '10 years and 8 months'
En Python, al restar dos objetos datetime.date
se obtiene un objeto datetime.timedelta
, que tiene un atributo de days
.
Convertir la diferencia de días en años y meses no está claramente definido; Si define un año como 365 días y un mes como 30 días, puede usar:
years, remainder = divmod(diff1.days, 365) months = remainder // 30
O bien, podría definir la duración promedio de los meses y años para que sea (un poco) más precisa:
avgyear = 365.2425 # pedants definition of a year length with leap years avgmonth = 365.2425/12.0 # even leap years have 12 months years, remainder = divmod(diff1.days, avgyear) years, months = int(years), int(remainder // avgmonth)
Con el último cálculo, su segunda diferencia sale como 11 años y 3 meses.
Los objetos de Timedelta no tienen información sobre meses, puede que sea mejor calcular los años y meses directamente
>>> d2.year - d1.year + (d2.month - d1.month)/12, (d2.month - d1.month)%12 (10, 8) >>> d4.year - d3.year + (d4.month - d3.month)/12, (d4.month - d3.month)%12 (11, 4)