2012-09-24 292 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) 
相关问题