У меня есть следующие три tz-осведомленных date_str:

  • "2015-01-08T08:21:43.8082Z"
  • "2015-01-08T08:21:43.808200Z"
  • ""2015-01-08T08:21:43Z"

Я пытаюсь прочитать их на питоне так: datetime.fromisoformat(date_str.replace('Z', '+00:00')), но это не удается для первого.

Я думаю, это потому, что первый не отформатирован в ISO.

Мой вопрос: есть ли в python быстрый способ (без сторонних методов) читать все три типа строк даты, осведомленных о tz?

0
Newskooler 2 Май 2021 в 23:26

1 ответ

Лучший ответ

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

datetime.datetime.strptime(date_str.replace("Z","+00:00"),"%Y-%m-%dT%H:%M:%S.%f%z")

Которая, кстати, также будет обрабатывать второй пример.

Но это все равно влечет за собой выбор другого парсера для разных форматов. Итак, у вас есть три варианта.

  1. Вы пишете код (например, используя регулярное выражение) для проверки полученной строки и вызываете соответствующую функцию для ее анализа.

  2. Вы очищаете ввод, добавляя конечные нули к миллисекундам, чтобы сделать его приемлемым для fromisoformat, так же, как вы уже делаете, чтобы исправить часовой пояс. Сделать это можно так:

    datetime.datetime.fromisoformat(date_str.replace("Z",".000000+00:00"[len(date_str)-20:]))
    

    который будет работать со всеми тремя вашими форматами, а также с некоторыми другими вариациями миллисекундной точности. Хотя при обзоре кода я бы отверг этот подход, потому что считаю его хрупким.

  3. Если вам нужен синтаксический анализатор, достаточно гибкий, чтобы самостоятельно обрабатывать незначительные изменения входных данных, ну, это то, для чего предназначен dateutil.

Где-то должна быть возможность работать с произвольными нестандартными форматами. Вы его либо пишете, либо импортируете.

Я бы поддержал dateutil против любой реализации, которую я мог бы написать, потому что она должна лучше справляться с вводом, которого я не ожидал. Но вы можете прийти к другому выводу.

1
BoarGules 2 Май 2021 в 21:51