给定时间原点,如何将日期时间从十进制转换为“%y-%m-%d%H:%M:%S”?

时间:2019-05-07 12:39:59

标签: python python-3.x datetime

我进行了搜索,但是找不到满足我问题的答案。

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

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:序数必须为> = 1

非常感谢您的回答

2 个答案:

答案 0 :(得分:3)

考虑到我对其他答案的评论,在这里留下一个明确的答案

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
>>> 

答案 1 :(得分:1)

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:可以使用天数作为参数,而不是用天-秒来构造时间增量(感谢accdias!):

dt = datetime.timedelta(days=t)