Как преобразовать дату и время из десятичного числа в «% y-% m-% d% H:% M:% S» с учетом времени начала? - PullRequest
3 голосов
/ 07 мая 2019

Я выполнил поиск, но не смог найти ответ, который удовлетворял бы моей проблеме.

Я использую Python 3.7 и мне нужно преобразовать серию десятичных чисел в объект datetime в форме %Y-%m-%d %H:%M:%S.При этом мне нужно учитывать исходную точку, например:

t = 0.000000 равно 2016-06-25 00:00:00

t = 0.010417 равно .....?

и так далее.Я знаю, что в моем десятичном времени целая часть - это день с начала, десятичная часть - это доля дня.

Я нашел ответ, используя R здесь .Я также думаю, что мне может понадобиться использовать метод класса 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 ]

3 голосов
/ 07 мая 2019

Просто чтобы оставить здесь четкий ответ, учитывая мои комментарии к другим ответам:

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 голос
/ 07 мая 2019

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...