如何将 Python 日期时间日期转换为十进制/浮点年

新手上路,请多包涵

我正在寻找一种将 datetime 对象转换为 decimal(/float) 年份的方法,包括小数部分。例子:

 >>> obj = SomeObjet()
>>> obj.DATE_OBS
datetime.datetime(2007, 4, 14, 11, 42, 50)

如何将 datetime.datetime(2007, 4, 14, 11, 42, 50) 转换为十进制年。我所说的十进制格式是指浮点值 2007.4523 ,其中小数部分是从年初(2007-01-01 到 2007-04-14)开始的秒数除以总数那一年的秒数(2007-01-01 到 2008-01-01)。

(注意:在统计建模中(例如线性回归),这称为 “时间指数”

原文由 user739807 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答
from datetime import datetime as dt
import time

def toYearFraction(date):
    def sinceEpoch(date): # returns seconds since epoch
        return time.mktime(date.timetuple())
    s = sinceEpoch

    year = date.year
    startOfThisYear = dt(year=year, month=1, day=1)
    startOfNextYear = dt(year=year+1, month=1, day=1)

    yearElapsed = s(date) - s(startOfThisYear)
    yearDuration = s(startOfNextYear) - s(startOfThisYear)
    fraction = yearElapsed/yearDuration

    return date.year + fraction

演示:

 >>> toYearFraction(dt.today())
2011.47447514

这种方法可能精确到秒(如果夏令时或其他奇怪的区域性事物生效,则精确到小时)。它在闰年期间也能正常工作。如果您需要剧烈的分辨率(例如由于地球自转的变化),您最好查询网络服务。

原文由 ninjagecko 发布,翻译遵循 CC BY-SA 3.0 许可协议

实施公认的解决方案后,我发现这个现代 pandas 版本是相同的,而且更简单:

 dat['decimal_date']=dat.index.year+ (dat.index.dayofyear -1)/365

必须在日期时间索引 Pandas 数据框上使用。添加这个解决方案帖子出现在我的谷歌搜索这个问题的顶部。

原文由 EHB 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题