calcular la diferencia entre dos fechas datetime.date () en años y meses

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)