2012-09-24 795 views

Respuesta

20

Si usted es capaz de instalar el paquete excelente dateutil, usted 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' 
+0

Gracias Burhan, probé su solución y parece que está calculando los años y el mes como se esperaba/con precisión. Gracias por el apoyo. –

10

En python, restar dos objetos datetime.date da como resultado un datetime.timedelta object, que tiene un atributo days.

No se ha definido claramente el número de días de diferencia en años y meses; si se define un año como 365 días y un mes como 30 días, se puede utilizar:

years, remainder = divmod(diff1.days, 365) 
months = remainder // 30 

O, se podría definir de año y mes longitudes medias a ser (un poco) más preciso:

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 meses.

+0

Totalmente de acuerdo en que debe definir lo que realmente significa una "diferencia de 1 mes". Pero ser * realmente * quisquilloso, dividir por alrededor de 30.45 podría dar mejores resultados, ya que en promedio eso es aproximadamente cuánto dura un mes, por lo que será más preciso durante largos períodos. –

+0

@StuCox: '365/12.0' es' 30.416666666666668', en realidad. Sí, puedes almacenar ese valor como la duración promedio del mes. –

+0

No olvide los años bisiestos ... (cada 4, pero no si es divisible por 100, a menos que también sea divisible por 400) entonces 365.2425 días por año, dividido entre 12 = 30.436875. ** Esto se está poniendo tonto. ** –

1

objetos timedelta no tienen información acerca de meses, puede que sea mejor para 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) 
Cuestiones relacionadas