我希望计算两个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.
谢谢。
如果您能够安装出色的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'
datetime.date
对象相减会得到一个datetime.timedelta
对象,该对象具有days
属性。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)
365/12.0
实际上是 30.416666666666668
。是的,您可以将该值存储为平均月份长度。 - Martijn Pietersyears, remainder = divmod(abs(diff1), YEAR); months = remainder // (YEAR / 12)
,其中YEAR = timedelta(365.2425)
。如果结果是整数年和月,则我们可以忽略每四年一次的一天误差(对于year=365)。 - jfstimedelta对象没有关于月份的信息,你最好直接计算年份和月份
>>> 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)