计算两个日期之间的年数,但以标准方式四舍五入



我想得到两个日期之间的四舍五入年数。relativedeltayears属性几乎做到了这一点,但由于它服务于不同的用例,所以它总是向下舍入而不是使用标准的舍入规则:

from datetime import datetime, date
from dateutil.relativedelta import relativedelta
almost_one_year_ago = date.today() - relativedelta(years=1) + relativedelta(days=1)
print(relativedelta(date.today(), almost_one_year_ago).years)

这输出0,我想要1

有没有一种好方法可以按照标准舍入规则将年数作为整数获取?如:如果低于 .5 年,则向下舍入,如果等于或高于 .5,则向上舍入?

您可以计算天数的差异,将其除以 365,然后四舍五入如下:

print(round((date.today() - almost_one_year_ago).days/365))

另一种考虑闰年的方法:

from datetime import datetime, date
from dateutil.relativedelta import relativedelta
target_date = date.today() - relativedelta(years=1) + relativedelta(days=1)
year_cnt = 0
one_year_ago = date.today() - relativedelta(years=1)
while ( target_date < one_year_ago ):
year_cnt += 1 # because it's a full year
one_year_ago -= relativedelta(years=1)
half_year_ago = one_year_ago + relativedelta(months=6)
if ( target_date <= half_year_ago ):
year_cnt += 1 # because it's greater or equal a half year (>= 0.5)
print(year_cnt)

我只是数了数所有整整年,然后检查剩余时间是否超过半年。

我找到了一个与闰年兼容的解决方案。它仍然没有我想要的那么干净,但它可以完成工作:

from datetime import datetime, date
from dateutil.relativedelta import relativedelta
def how_many_years_ago(input_date):
difference = relativedelta(date.today(), input_date)
result = difference.years
# Round up if closer to the next year than the previous
if difference.months >= 6:
result += 1
return result
# Exactly 1 year ago, should output 1
print(how_many_years_ago(date.today() - relativedelta(years=1)))
# Almost 1 year ago, should round up to 1
print(how_many_years_ago(date.today() - relativedelta(years=1) + relativedelta(days=1)))
# Too far removed from 35 years, should round down to 34
print(how_many_years_ago(date.today() - relativedelta(years=35) + relativedelta(months=8)))
# Almost 38 years ago, should round up to 38
print(how_many_years_ago(date.today() - relativedelta(years=38) + relativedelta(months=4)))

如果我没有忽略某些警告(如闰年(,这个实现解决了我的问题。

您可以使用 days 属性并计算年数,而不是使用年份属性。这样您就可以控制它的舍入方式

最新更新