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

问题描述:

我正在寻找一种将日期时间对象转换为十进制(/浮点)年(包括小数部分)的方法。示例:

I am looking for a way to convert datetime objects to decimal(/float) year, including fractional part. Example:

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

如何将 datetime.datetime(2007,4,14,14,11,42,50)转换为十进制年份?从这种格式 dd / mm / yyyy 到这种格式 yyyy.zzzz

How do I convert datetime.datetime(2007, 4, 14, 11, 42, 50) to decimal years? From this format dd/mm/yyyy to this kind of format yyyy.zzzz

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

(NOTE: in statistical modeling (e.g. for linear regression), this is called "time index")

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

秒(如果实行夏令时或其他奇怪的地区性措施,则为小时)。在leap年期间也可以正常工作。如果您需要大幅度的分辨率(例如由于地球自转的变化),那么最好查询网络服务。

This method is probably accurate to within the second (or the hour if daylight savings or other strange regional things are in effect). It also works correctly during leapyears. If you need drastic resolution (such as due to changes in the Earth's rotation) you are better off querying a net service.