10

Преобразование даты в datetime в Python

13

Проблема: Есть ли встроенный метод для преобразования объекта date в объект datetime в Python? Например, как получить объект datetime для полуночи заданной даты? Противоположное преобразование сделать просто: у объекта datetime есть метод .date().

Действительно ли мне нужно вручную вызывать datetime(d.year, d.month, d.day)?

5 ответ(ов)

2

Существует несколько способов, хотя я считаю, что упомянутый вами (и не любимый вами) является самым читаемым.

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

1

Принятый ответ верен, но я предпочёл бы избегать использования 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,
)

Это моя точка зрения на то, что "явное лучше неявного".

0

Вы можете использовать метод date.timetuple() и оператор распаковки *. Пример кода:

args = d.timetuple()[:6]
datetime.datetime(*args)

Этот код сначала получает кортеж с атрибутами даты d, затем извлекает первые шесть элементов (год, месяц, день, час, минуты и секунды) и распаковывает их в конструктор datetime.datetime(), создавая объект даты и времени.

0

Вы также можете использовать следующий код:

from datetime import datetime

date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())

print(dt)

Это приведёт к выводу, например:

datetime.datetime(2021, 11, 15, 0, 0)

Таким образом, вы получите объект datetime с временем, установленным на полночь в UTC.

0

На сегодняшний день, 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 настолько мощные, что жаль, что их документация оставляет желать лучшего...

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь