Как перевести строку даты и времени в формате ISO 8601 в объект datetime Python?
У меня есть строка даты и времени в формате "2009-05-28T16:15:00" (это, насколько я понимаю, формат ISO 8601). Один из решения, которое кажется не очень элегантным, — это разобрать строку, используя функцию time.strptime
, а затем передать первые шесть элементов кортежа в конструктор datetime
, как показано ниже:
datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])
Мне не удалось найти более "чистый" способ сделать это. Есть ли более удобное решение?
3 ответ(ов)
Обратите внимание на информацию о временных зонах, так как вы можете столкнуться с проблемами, сравнивая даты и время без информации о временной зоне с теми, которые её содержат.
Лучше всего всегда делать временные метки с учетом временной зоны (даже если это будет только UTC), если вы действительно не уверены, зачем может понадобиться работать без неё.
Вот пример кода на Python:
#-----------------------------------------------
import datetime
import pytz
import dateutil.parser
#-----------------------------------------------
utc = pytz.utc
BERLIN = pytz.timezone('Europe/Berlin')
#-----------------------------------------------
def to_iso8601(when=None, tz=BERLIN):
if not when:
when = datetime.datetime.now(tz)
if not when.tzinfo:
when = tz.localize(when)
_when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
return _when[:-8] + _when[-5:] # Удалить микросекунды
#-----------------------------------------------
def from_iso8601(when=None, tz=BERLIN):
_when = dateutil.parser.parse(when)
if not _when.tzinfo:
_when = tz.localize(_when)
return _when
#-----------------------------------------------
Этот код помогает гарантировать, что все даты и время, с которыми вы работаете, имеют соответствующую информацию о временной зоне, что защитит вас от возможных ошибок при сравнении или манипуляциях с ними.
Ваш код выглядит почти правильно, однако в нем есть некоторые моменты, которые можно улучшить для большей читабельности и корректности.
Во-первых, давайте рассмотрим функцию convert_enddate_to_seconds
, которая находит количество секунд с начала эпохи (epoch time) на основе строки времени в формате ISO 8601. Код также учитывает миллисекунды и временные зоны.
Вот пример использования функции:
import datetime
import time
def convert_enddate_to_seconds(ts):
"""Принимает строку формата ISO 8601 и преобразует в эпоху времени."""
# Убираем информацию о временной зоне и преобразуем часть даты и времени
dt = datetime.datetime.strptime(ts[:-7], '%Y-%m-%dT%H:%M:%S.%f') + \
datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:])) * int(ts[-6:-5] + '1')
# Преобразуем в секунды
seconds = time.mktime(dt.timetuple()) + dt.microsecond / 1000000.0
return seconds
# Пример использования
ts = '2012-09-30T15:31:50.262-08:00'
seconds = convert_enddate_to_seconds(ts)
print(seconds) # Вывод: 1348990310.262
Основные моменты:
- Функция принимает строку
ts
формата ISO 8601. - Она использует
strptime()
для преобразования строки в объектdatetime
, игнорируя информацию о временной зоне при первом преобразовании. - Затем добавляет соответствующее смещение времени (часа и минуты) в зависимости от временной зоны.
- Для получения времени в секундах от эпохи используется функция
time.mktime()
, которая требует преобразованияdatetime
вtimetuple
. - Последний шаг — добавление миллисекунд.
Не забудьте протестировать функцию с разными временными строками, чтобы убедиться, что она работает корректно!
Для преобразования времени из формата Epoch в формат ISO и наоборот в Python, вы можете использовать следующий код:
Преобразование Epoch в ISO время:
isoTime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(epochTime))
Этот код использует функцию time.strftime
, чтобы отформатировать время в виде строки ISO. Входным параметром является epochTime
, который представляет собой время в формате Epoch, а time.gmtime()
преобразует его в структурированное представление времени (UTC).
Преобразование ISO времени в Epoch:
epochTime = time.mktime(time.strptime(isoTime, '%Y-%m-%dT%H:%M:%SZ'))
Здесь используется time.strptime
для преобразования строки в формате ISO обратно в структурированное представление времени, после чего time.mktime
конвертирует его в Epoch. Входным параметром для strptime
является строка isoTime
, содержащая время в формате ISO.
Надеюсь, это поможет вам в ваших задачах!
Существует ли список временных зон Pytz?
Как преобразовать datetime в date?
Как получить день недели по заданной дате?
Как конвертировать секунды в часы, минуты и секунды?
Как отсортировать DataFrame pandas по одному столбцу