如何将Python datetime日期转换为十进制/浮点年份
我想找到一种方法,把日期时间对象转换成小数(或浮点数)格式的年份,包括小数部分。举个例子:
>>> 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
这个方法的准确性大概能到秒(如果有夏令时或者其他奇怪的地区性调整,可能会到小时)。而且它在闰年时也能正常工作。如果你需要非常精确的时间(比如因为地球自转的变化),那你最好去查询一个网络服务。