2012-09-24 285 views

回答

20

如果你能夠安裝的出色dateutil包,你可以做到這一點的年直接月份:

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

感謝Burhan,我嘗試了您的解決方案,它似乎是按照預期/準確計算年和月。感謝您的支持。 –

10

在python中,減去兩個datetime.date對象會產生一個datetime.timedelta object,它具有days屬性。

將差異的天數轉換爲幾年和幾個月沒有明確定義;如果你定義一個一年365天,每月30天,你可以使用:

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

或者,你可以定義平均年份和月份的長度爲(略)更準確:

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) 

在後面的計算中,你的第二個差異出現在11年和個月。

+0

完全同意您需要定義「1個月的差異」的真正含義。但如果真的很挑剔,除以30.45可能會帶來更好的結果,因爲平均而言,一個月的時間長度將會長期更準確。 –

+0

@StuCox:'365/12.0'實際上是'30.416666666666668'。是的,您可以將該值存儲爲平均月份長度。 –

+0

不要忘記閏年......(每4年,但不能被100除盡,除非可以被400整除),每年365.2425天,除以12 = 30.436875。 **這太傻了。** –

1

timedelta對象沒有有關幾個月,你可能會更好計算

>>> 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) 
相關問題