Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python datetime到十进制年份:休息一天,bug在哪里?_Python_Datetime - Fatal编程技术网

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)
。注: