9

我想以年和月计算两个 datetime.date() 日期之间的差异。

例如;

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

期望的结果:

diff1 == 10 years & 8 months. 
diff2 == 11 years & 4 months.

谢谢。

4

3 回答 3

26

如果你能够安装优秀的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'
于 2012-09-24T11:40:43.087 回答
11

在python中,减去两个datetime.date对象会得到一个datetime.timedelta对象,它有一个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 年零3个月。

于 2012-09-24T11:29:38.593 回答
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)
于 2012-09-24T11:39:15.067 回答