如何从Python中的日期时间对象计算年份分数?

时间:2019-05-17 20:09:18

标签: python datetime timedelta

我有两个表示为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

2 个答案:

答案 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