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

Python 计算两个日期之间的年数,但以标准方式四舍五入,python,Python,我想得到两个日期之间的四舍五入年数relativedelta的years属性几乎可以做到这一点,但由于它服务于不同的用例,因此它总是向下舍入,而不是使用标准的舍入规则: from datetime import datetime, date from dateutil.relativedelta import relativedelta almost_one_year_ago = date.today() - relativedelta(years=1) + relativedelta(day

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

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)
从日期时间导入日期时间,日期
从dateutil.relativedelta导入relativedelta
target_date=date.today()-relativedelta(年份=1)+relativedelta(天数=1)
年份=0
一年前=日期.今天()-relativedelta(年=1)
而(目标日期<一年前):
年份_cnt+=1#因为这是一整年
一年前-=相对寿命(年=1)
半年前=一年前+相对寿命(月=6)

如果(target_date,您可以使用days属性,而不是years属性,并计算年数。这样您可以控制它的取整方式。我找到了一个与闰年兼容的解决方案。它仍然没有我想要的那么干净,但它可以完成以下任务:

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

如果我没有忽略某些注意事项(如闰年),此实现解决了我的问题。

为什么要在几乎一年前使用实际年份,减去1年,再加上1天?这不会超过一年。几乎一年前=日期。今天()-relativedelta(years=1)结果将是1我认为,
差不多一年前
应该是差不多一年的时间间隔,所以这应该是正确的。
的工作原理略有不同。
相对德尔塔(date.today(),date.today()-相对德尔塔(days=364)).days
返回
30
,例如。这就是为什么我不使用relativedelta,而是使用
(date.today()-几乎一年前)。days
,这给了你364天。哦,你说得对。我的错!你如何考虑不是所有年份都有365天的警告?
days
的工作原理略有不同。
relativedelta(date.today(),date.today()-relativedelta(days=364))。例如,days
返回
30
。如上所述,我只想减去日期。至于闰年(由于声誉不高,我无法对上述内容进行评论)。这取决于你想如何解释闰年。我们每四年有一次闰年,因此,当计算365*4年以上的增量时,你的计算将是错误的。不幸的是,比这更复杂一些!我对重新发明轮子有点犹豫。我找到了一个可能解决我问题的解决方案,并且不需要manual闰年的处理。我在下面发布了它。如果你没有看到任何隐藏的警告,那么基于
月数>=6的递增就可以了!