python - 计算两个日期之间的年数,但以标准方式四舍五入
问题描述
我想获得两个日期之间的四舍五入年数。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
。
有没有一种按照标准舍入规则将年数作为整数的好方法?如:如果低于 0.5 年则向下舍入,如果等于或高于 0.5 年则向上舍入?
解决方案
我找到了一个与闰年兼容的解决方案。它仍然没有我想要的那么干净,但它可以完成工作:
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)))
如果我没有忽略某些警告(如闰年),那么这个实现解决了我的问题。
推荐阅读
- java - JAVA:映射字符串键是什么意思?
- git - git merge master 覆盖更改
- jquery - 使用ajax访问API
- groovy - 仅在 grails spock 测试上乘以表达式时,列表收集不起作用
- swift - 如何将内存缓冲区转换为 swift 结构
- python - 在 Stack Overflow 上标记帖子时出现“您无权标记此帖子”
- ios - 为什么我的 UICollectionViewCell 没有用投影四舍五入?
- sql - 将 varchar 值“durationms”转换为数据类型 int 时转换失败
- regex - 正则表达式删除仅包含 1 个单词的所有行
- javascript - 在 JavaScript 中访问输入文件上传字段