【问题标题】:How to convert datetime from decimal to “%y-%m-%d %H:%M:%S” given the time origin?给定时间原点,如何将日期时间从十进制转换为“%y-%m-%d %H:%M:%S”?
【发布时间】:2019-05-07 12:39:59
【问题描述】:

我四处搜索,但找不到满足我问题的答案。

我正在使用 python 3.7,我需要将一系列十进制数字转换为 %Y-%m-%d %H:%M:%S 形式的日期时间对象。这样做时,我需要考虑一个原点,例如:

t = 0.000000 等于 2016-06-25 00:00:00

t = 0.010417 等于.....?

等等。我知道在我的十进制时间内,整数部分是自开始以来的天数,小数部分是天数的小数部分。

我使用 R here 找到了答案。我也认为我可能需要使用类方法date.fromordinal(ordinal)或类似的方法,但我不知道该怎么做。

这是我迄今为止尝试过的:

示例t = 1.010416

import datetime as DT
from datetime import timedelta  
day = int(x)
datetime_object = DT.datetime.strptime("2016-06-25 00:00:00", '%Y-%m-%d %H:%M:%S')
python_datetime = DT.datetime.fromordinal(day) + timedelta(days=datetime_object.day-1)

我明白了:

datetime.datetime(1, 1, 25, 0, 0)

但我无法添加 2016 年或月份。此外,对于int(t) = 0 的每种情况,我都会得到:

ValueError: ordinal must be >= 1

非常感谢您的回答

【问题讨论】:

  • @glibdud 我已经编辑了问题

标签: python python-3.x datetime


【解决方案1】:

只是在这里留下一个明确的答案,考虑到我对其他答案的cmets:

from datetime import datetime,timedelta

base_date = datetime(2016, 6, 25)
deltas = (2.34857, 0.010417, 1.010416)

for delta in deltas:
    print((base_date + timedelta(delta)).strftime('%Y-%m-%d %H:%M:%S'))

该代码产生以下输出:

>>> from datetime import datetime,timedelta
>>> 
>>> base_date = datetime(2016, 6, 25)
>>> deltas = (2.34857, 0.010417, 1.010416)
>>> 
>>> for delta in deltas:
...     print((base_date + timedelta(delta)).strftime('%Y-%m-%d %H:%M:%S'))
... 
2016-06-27 08:21:56
2016-06-25 00:15:00
2016-06-26 00:14:59
>>> 

【讨论】:

    【解决方案2】:

    timedelta 以这种格式存储其数据:(DAYS, SECONDS),因此您可以轻松计算:

    import datetime
    
    t = 2.34857
    
    # Full days
    days = int(t)
    
    # Part of a day
    part_of_day = t - int(t)
    seconds = int(part_of_day * 24 * 60 * 60)
    
    # Calculate the time delta
    dt = datetime.timedelta(
        days=days,
        seconds=seconds
    )
    
    # Add t-delta to the first day
    first_day = datetime.datetime(2016, 6, 25)
    current_time = first_day + dt
    current_time
    

    将返回:

    datetime.datetime(2016, 6, 27, 8, 21, 56)

    然后就可以用这个函数把它转成字符串了:

    datetime.datetime.strftime(current_time, '%Y-%m-%d %H:%M:%S')

    '2016-06-27 08:21:56'


    编辑 1: 可以使用浮点天数作为参数,而不是按天秒构建 timedelta(感谢 accdias!):

    dt = datetime.timedelta(days=t)

    【讨论】:

    • 没有必要将t 分解成整数和小数部分以及转换的东西。只需将其作为 datetime.datetime() 的天数,它就会做正确的事情。
    • @vumux,我的荣幸。
    • 另外一点:您的代码中的current_time 已经是datetime.datetime 的一个实例。考虑到这一点,您只需要current_time.strftime('%Y-%m-%d %H:%M:%S')
    • 我用它来显示datetime对象的存在。当然我的代码可以缩短。但我更喜欢写更多让别人了解更多:)
    • @vurmux 非常感谢!我注意到我几乎要考虑添加 timedelta 了,但我做得不好。我也喜欢以天秒为单位构建时间增量,因为这让我可以灵活地根据需要舍入微秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2021-11-26
    • 2019-01-28
    • 2019-01-08
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多