Python datetime到十进制年份:休息一天,bug在哪里?
我实现了一个基于。我没有得到预期的结果,但我找不到错误Python datetime到十进制年份:休息一天,bug在哪里?,python,datetime,Python,Datetime,我实现了一个基于。我没有得到预期的结果,但我找不到错误 from datetime import datetime, timedelta def decimal_year_to_datetime(decimal_year_float): year = int(decimal_year_float) remain = decimal_year_float - year base = datetime(year, 1, 1) whole_year_time_delt
from datetime import datetime, timedelta
def decimal_year_to_datetime(decimal_year_float):
year = int(decimal_year_float)
remain = decimal_year_float - year
base = datetime(year, 1, 1)
whole_year_time_delta = (base.replace(year=base.year + 1) - base)
fractional_seconds = whole_year_time_delta.total_seconds() * remain
our_time_delta = timedelta(seconds=fractional_seconds)
result = base + our_time_delta
return result
def test_conversion():
year = 2013
month = 1
day = 1
hour = 2
minute = 16
second = 48
date = datetime(year=year, month=month, day=day)
fraction_of_the_day = (hour + (minute + second / 60.0) / 60.0) / 24.
days_in_year = (date.replace(year=date.year + 1) - date).days
dec_yr = year + (date.timetuple().tm_yday +
fraction_of_the_day) / float(days_in_year)
expect_date = datetime(year=year, month=month, day=day,
hour=hour, minute=minute, second=second)
got_date = decimal_year_to_datetime(dec_yr)
assert(got_date == expect_date)
if __name__ == '__main__':
test_conversion()
我似乎有一天(一分之一秒)的转换。但是我看不到虫子
我错过了一些显而易见的事情吗? < P>你有一天离开了(经典的FESTEPOST错误!),因为,尽管我们认为1月1日是一年中的第一天,但在计算方面,<0强>第0天< /强>。最简单的修复方法是添加-1
,但您的方法通常相当复杂;我会这样做:
def dt_to_dec(dt):
"""Convert a datetime to decimal year."""
year_start = datetime(dt.year, 1, 1)
year_end = year_start.replace(year=dt.year+1)
return dt.year + ((dt - year_start).total_seconds() / # seconds so far
float((year_end - year_start).total_seconds())) # seconds in year
使用中:
>>> dec = dt_to_dec(datetime(2013, 1, 1, 2, 16, 48))
>>> dec
2013.0002602739726
>>> decimal_year_to_datetime(dec)
datetime.datetime(2013, 1, 1, 2, 16, 47, 999999)
(考虑到浮点精度,这是您可能得到的最接近的…注意:可能会考虑本地utc偏移量的变化,无论出于何种原因,否则您可能会引入小时误差(例如,欧洲2014年/莫斯科时区)。这是罕见的,它只引入了
~1e-4
错误——看看在您的情况下是否可以忽略它time.mktime()
可以将某些系统上的错误减少到~6e-8
(如果您的输入在几秒钟内就知道了,那就足够了)。在Python 3上,您可以将其编写为dt.year+(dt-year\u start)/(year\u end-year\u start)
。注: