我有两个表示为datetime
对象的日期,并试图以年份的分数计算两个日期之间的时间(相当于Excel yearfrac
函数)。
使用relativedelta
,我可以得到日期之间的年数,月数和天数,但不是年份的分数,我也可以减去日期以得到天数,但是除以365.25似乎无法得到我期望的答案。
start_date = dt.datetime(2010, 12, 31)
end_date = dt.datetime(2019, 5, 16);
delta = relativedelta(end_date, start_date);
print(delta)
这是我得到的输出:
相对增量(年= + 8,月= + 4,天= + 16)
我正在寻找的是:8.38
如果我使用以下代码:
delta = (end_date - start_date)/365.25
print(delta)
我得到以下输出: 8天8:56:10.841889
答案 0 :(得分:0)
我刚刚做过8 +((月* 30)+天)/ 365 = 8.3726的数学运算。假设所有月份为30天,一年为365天。精度较差,但可以放在一行上。如果除以错误的数字365.25,会得到什么?它必须有多精确?
如果您需要绝对精度,我会简单地做到:
from datetime import date
d0 = date(2010, 12, 31)
d1 = date(2019, 5, 16)
delta = d1 - d0
delta_fraction = delta.days/365.25
print(delta_fraction)
# Output: 8.72348
编辑 这是一个简化的解决方案,假设一年中有365.25天(您可以使用365.2425天来精确到400年例外)来说明leap年。如果您要求它与excel的输出完全匹配,最好为excel写一个vba宏
答案 1 :(得分:0)
要记住的一件事是,datetime.datetime
个对象定义了减法运算符,并返回一个datetime.timedelta
对象。并且datetime.timedelta
对象定义了除法运算符,因此您可以获得timedelta
与一个普通年份(365天)或所有普通年份和leap年的平均长度(365天,5个)之间的比率。小时49分12秒)。
import datetime as dt
start_date = dt.datetime(2010, 12, 31)
end_date = dt.datetime(2019, 5, 16)
print(round((end_date-start_date)/dt.timedelta(365,0,0,0),2)) #8.38
print(round((end_date-start_date)/dt.timedelta(365,5,49,12),2)) #8.38