Преобразование даты в datetime в Python
Проблема: Есть ли встроенный метод для преобразования объекта date
в объект datetime
в Python? Например, как получить объект datetime
для полуночи заданной даты? Противоположное преобразование сделать просто: у объекта datetime
есть метод .date()
.
Действительно ли мне нужно вручную вызывать datetime(d.year, d.month, d.day)
?
5 ответ(ов)
Существует несколько способов, хотя я считаю, что упомянутый вами (и не любимый вами) является самым читаемым.
>>> import datetime
>>> t = datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)
И так далее — в целом, все эти методы основаны на правильном извлечении информации из объекта date
и ее передаче в подходящий конструктор или класс-метод для datetime
.
Принятый ответ верен, но я предпочёл бы избегать использования datetime.min.time()
, потому что мне не совсем понятно, что это именно делает. Если вам это понятно, то замечательно. То же самое касается метода timetuple
и зависимости от порядка.
На мой взгляд, самый читаемый и явный способ сделать это без того, чтобы читатель был слишком знаком с API модуля datetime
, выглядит так:
from datetime import date, datetime
today = date.today()
today_with_time = datetime(
year=today.year,
month=today.month,
day=today.day,
)
Это моя точка зрения на то, что "явное лучше неявного".
Вы можете использовать метод date.timetuple()
и оператор распаковки *
. Пример кода:
args = d.timetuple()[:6]
datetime.datetime(*args)
Этот код сначала получает кортеж с атрибутами даты d
, затем извлекает первые шесть элементов (год, месяц, день, час, минуты и секунды) и распаковывает их в конструктор datetime.datetime()
, создавая объект даты и времени.
Вы также можете использовать следующий код:
from datetime import datetime
date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())
print(dt)
Это приведёт к выводу, например:
datetime.datetime(2021, 11, 15, 0, 0)
Таким образом, вы получите объект datetime
с временем, установленным на полночь в UTC.
На сегодняшний день, 2016 год, я думаю, что самое чистое решение предоставляет класс Timestamp из библиотеки pandas:
from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)
Timestamp является эквивалентом datetime в pandas и в большинстве случаев взаимозаменяем с ним. Проверьте это:
from datetime import datetime
isinstance(pd.Timestamp(d), datetime)
Но если вам действительно нужен обычный объект datetime, вы все равно можете сделать так:
pd.Timestamp(d).to_datetime()
Timestamp обладает гораздо большим количеством возможностей по сравнению с datetime, особенно при работе с временными зонами. На самом деле, Timestamps настолько мощные, что жаль, что их документация оставляет желать лучшего...
Как получить день недели по заданной дате?
Как рассчитать количество дней между двумя заданными датами
Как вывести дату в стандартном формате?
Итерация по диапазону дат в Python
Преобразование строки даты JSON в datetime в Python