2012-09-24 2 views

Antwort

20

Wenn Sie in der Lage zu berechnen, sind die ausgezeichnete dateutil-Paket zu installieren, können Sie dies tun:

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

Danke Burhan, ich habe deine Lösung versucht und es scheint die Jahre und den Monat wie erwartet/genau zu berechnen. Danke für die Unterstützung. –

10

In Python ergibt das Subtrahieren von zwei datetime.date Objekten eine datetime.timedelta object, die ein days Attribut hat.

Die Anzahl der Tage Unterschied in Jahren und Monaten ist nicht klar definiert; wenn Sie ein Jahr 365 Tage und einen Monat als 30 Tage definieren, könnten Sie verwenden:

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

Oder könnten Sie durchschnittliche Jahr und Monat Längen definieren zu sein (leicht) genauer:

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) 

Mit der letzten Berechnung kommt Ihr zweiter Unterschied als 11 Jahre und Monate.

+0

Stimmen Sie völlig zu, dass Sie definieren müssen, was ein "Unterschied von 1 Monat" wirklich bedeutet. Aber * wirklich * wählerisch zu sein, dividiert durch etwa 30,45 könnte bessere Ergebnisse liefern, da es im Durchschnitt darum geht, wie lang ein Monat ist, so wird es über lange Zeiträume genauer sein. –

+0

@StuCox: '365/12.0' ist' 30.416666666666668', eigentlich. Ja, Sie können diesen Wert als durchschnittliche Monatslänge speichern. –

+0

Schaltjahre nicht vergessen ... (alle 4, aber nicht wenn durch 100 teilbar, außer wenn auch durch 400 teilbar) 365.2425 Tage pro Jahr, dividiert durch 12 = 30.436875. ** Das wird albern. ** –

1

Timedelta-Objekte haben keine Informationen über Monate, Sie könnten besser sein, die Jahre und Monate direkt

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