Эффективное кодирование с датами и временем в Python

Efficient encoding of dates and times in Python

Использование datetime, zoneinfo, dateutil и pandas

Фото от Jordan Benton с Pexels

Я недавно активно работал с данными временных рядов и имел дело с объектами даты и времени в Python. Для этого я изучил некоторые полезные приемы работы с объектами datetime в Python, которые позволили упростить мой код. В этой статье я хотел бы поделиться и обобщить самые ценные советы и приемы, которые я изучил.

Для демонстрации я буду использовать два набора данных Kaggle, ссылки на которые я предоставлю при использовании. Если вы хотите следовать за мной, вы можете импортировать следующие библиотеки.

Datetime, zoneinfo, dateutil и pytz

Часто используемые пакеты, которые работают с датами и временем в Python, это datetime, dateutil, pytz и недавно добавленный zoneinfo. Datetime – это встроенный модуль для работы с временем и датами в Python, который позволяет выполнять большинство основных операций. Dateutil и pytz – это сторонние модули и мощные расширения для datetime, позволяющие работать с более сложными манипуляциями, такими как относительные временные интервалы, часовые пояса и разбор строк.

Однако начиная с версии Python 3.9, zoneinfo включен в стандартную библиотеку Python и, следовательно, считается “удобнее” для поддержки часовых поясов по сравнению с другими сторонними модулями, такими как dateutil или pytz.

Таким образом, в зависимости от версии Python, с которой вы работаете, встроенные модули Python могут быть уже достаточными, и сторонние модули (dateutil и pytz) не требуются при работе с разными часовыми поясами!

В остальной части статьи я сосредоточусь в основном на работе с датами и временем с использованием datetime, но также упомяну возможные варианты для zoneinfo или dateutil. Статья сначала сосредоточится на отдельных объектах datetime, а затем на работе с датами в массивах и таблицах данных с использованием numpy и pandas:

  1. Создание даты или datetime с нуля
  2. Преобразование и разбор строк: strftime(), strptime() и dateutil
  3. Даты и времена в numpy – datetime64 в numpy
  4. Даты и времена в pandas
  5. Создание признаков на основе дат и времен

1. Создание даты или datetime с нуля

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

Кроме того, datetime позволяет создавать объекты даты и времени, которые относятся к сегодняшнему дню или текущему времени.

Будьте осторожны, поскольку объекты datetime обычно “не имеют информации о часовом поясе” и не относятся к определенному часовому поясу, что может вызвать проблемы при работе с международными коллегами!

С помощью модуля zoneinfo (встроенного начиная с версии Python 3.9) вы можете установить часовой пояс с помощью параметра tz функции astimezone().

2. Преобразование и разбор строк: strftime(), strptime() и dateutil

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

Преобразование объекта datetime (или его частей) в строку

Здесь можно найти общеиспользуемые коды формата для описания объектов datetime.

Преобразование строки в объект datetime

Разбор сложных строк с использованием dateutil

3. Даты и времена в numpy – datetime64 в numpy

Если вы работаете с большими наборами данных, numpy’s datetime64 может пригодиться, так как благодаря своей конструкции он может быть намного быстрее работы с объектами datetime и dateutil. Тип данных datetime64 в numpy кодирует даты и времена в виде 64-битных целых чисел.

Это хранит даты и время компактно и позволяет векторизованные операции (повторяющиеся операции, применяемые к каждому элементу массива numpy).

Как вы можете видеть при запуске приведенного выше кода, при использовании объекта datetime или dateutil векторизованные операции вызовут ошибку.

4. Даты и время в pandas

Pandas может быть хорошим выбором при работе над проектом с данными временных рядов.

Известная библиотека для работы с данными pandas сочетает удобство datetime и dateutil с эффективностью хранения и возможностью манипулирования из numpy.

Создание фрейма данных pandas (из CSV) с разбором столбца с датой

Теперь у нас есть базовое понимание обработки дат и времени в Python с использованием numpy и pandas. Однако часто мы не создаем даты и время сами, а они уже являются частью набора данных, с которыми мы работаем. Давайте создадим фрейм данных pandas с столбцом даты (набор данных Kaggle NFL).

Как вы можете видеть, при загрузке из CSV столбец, содержащий дату, преобразуется в строковый формат, если нигде не указано иначе. Чтобы получить формат даты, вы можете создать дополнительный столбец с названием «gameDate_dateformat» или передать столбец даты через параметр parse_dates в pd.read_csv().

Еще одна удобная манипуляция при работе с данными временных рядов – это возможность фильтровать по дате/времени или создавать подмножество фрейма данных с использованием даты/времени. Есть два способа сделать это: фильтрация/создание подмножества или индексация.

Фильтрация фреймов данных pandas по времени

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

Если столбец, по которому вы хотите фильтровать, имеет формат datetime (как в примере), дата сравнения не может быть просто датой, а должна иметь формат datetime!

Индексирование фреймов данных pandas по времени

Еще более мощной функцией является индексация фрейма данных pandas по дате или времени.

Индексация может быть особенно полезной при работе с временными рядами, так как есть методы, такие как скользящие окна и сдвиг по времени.

5. Создание признаков на основе дат и времени

Часто нас не интересует сама дата, а может быть продолжительность, день недели или просто часть даты и времени, например, год. Для этого datetime, а также pandas предоставляют некоторые полезные манипуляции.

Timedelta

С помощью pandas вы можете вычислить, например, разницу между двумя датами. Для этого мы рассмотрим другой набор данных по поездкам на Uber (набор данных Kaggle Uber) с начальной и конечной отметкой времени. Для начала нам понадобится предварительная обработка (удаление строки Total), чтобы начать изучать timedelta.

Извлечение дня недели или месяца

Это работает немного по-другому для одиночной даты по сравнению с pandas Series. В то время как день недели или месяц для одиночного объекта datetime можно получить непосредственно, добавив атрибут (например, .month) или метод (например, weekday()), для pandas Series всегда нужен доступ к .dt.

Объект dt. позволяет получить доступ к атрибутам и методам, специфичным для даты и времени, из объекта Series.

Создание запаздывания даты/времени

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

Резюме

Для работы с объектами даты или времени в Python полезно знать основы встроенного пакета datetime (например, date() или strftime() и strptime()). Zoneinfo – это новый встроенный пакет (начиная с версии 3.9), который более удобен, чем сторонние модули при работе с различными часовыми поясами. Dateutil – ценная библиотека для более сложных манипуляций с датой и временем при работе с отдельными объектами даты, например, разбор сложных строк. При работе с датами и временем в фреймах данных, Series или массивах pandas объединяет преимущества datetime, dateutil и numpy и служит удобной библиотекой.

Источники

  • Современная стандартная библиотека Python — Кулинарная книга Алессандро Молины (2018)
  • Руководство по науке о данных на языке Python Джейк ВандерПлас (2017)
  • Курс Datacamp: Работа с датами и временем в Python (2022)
  • https://dateutil.readthedocs.io/en/stable/
  • https://docs.python.org/3/library/datetime.html
  • https://docs.python.org/3/library/zoneinfo.html
  • https://peps.python.org/pep-0615/
  • https://github.com/stub42/pytz/blob/master/src/README.rst#issues–limitations