Преобразование даты в 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 настолько мощные, что жаль, что их документация оставляет желать лучшего...
Как получить день недели по заданной дате?
Сравнение двух дат в JavaScript
Существует ли список временных зон Pytz?
Как преобразовать datetime в date?
Как конвертировать секунды в часы, минуты и секунды?