首页 > 解决方案 > 计算两个日期之间的年数,但以标准方式四舍五入

问题描述

我想获得两个日期之间的四舍五入年数。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

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

标签: python

解决方案


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

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

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


推荐阅读