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

21 投票
9 回答
41141 浏览
提问于 2025-04-16 20:08

我想找到一种方法,把日期时间对象转换成小数(或浮点数)格式的年份,包括小数部分。举个例子:

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

我怎么把 datetime.datetime(2007, 4, 14, 11, 42, 50) 转换成小数年份呢?这里的小数格式指的是像 2007.4523 这样的浮点值,其中小数部分表示从这一年开始(2007年1月1日)到2007年4月14日的秒数,除以这一年总的秒数(从2007年1月1日到2008年1月1日)。

(注意:在统计建模中,比如线性回归,这被称为 "时间索引"

9 个回答

4

看起来没有人提到这一点,但由于从datetime.datetime对象相减得到的datetime.timedelta对象有一个除法方法,你可以使用这个简单的函数

from datetime import datetime
def datetime2year(dt): 
    year_part = dt - datetime(year=dt.year, month=1, day=1)
    year_length = (
        datetime(year=dt.year + 1, month=1, day=1)
        - datetime(year=dt.year, month=1, day=1)
    )
    return dt.year + year_part / year_length

这里的除法是针对datetime.timedelta对象进行的。

4

这是一种比其他方法更简单的做法:

import datetime
def year_fraction(date):
    start = datetime.date(date.year, 1, 1).toordinal()
    year_length = datetime.date(date.year+1, 1, 1).toordinal() - start
    return date.year + float(date.toordinal() - start) / year_length

>>> print year_fraction(datetime.datetime.today())
2016.32513661

请注意,这个计算是基于一天的开始时间,所以12月31日的结果是0.997,而不是1.0。

35
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

这个方法的准确性大概能到秒(如果有夏令时或者其他奇怪的地区性调整,可能会到小时)。而且它在闰年时也能正常工作。如果你需要非常精确的时间(比如因为地球自转的变化),那你最好去查询一个网络服务。

撰写回答