Глубокое погружение в Timestamp, ядро ​​функциональности даты и времени Pandas.

Когда дело доходит до работы со временем и датами в ваших проектах данных, вы можете легко запутаться без надлежащих инструментов — форматы даты, разрешение даты, которое вам нужно (годы, месяцы, дни, наносекунды для крика вслух?), различия дат — все эти вещи могут быть крайне сложным, если не используется правильный тип данных. Время сложно во всех смыслах, обработка данных ничем не отличается. У него так много атрибутов и свойств, что любая сложная манипуляция может оказаться совершенно бесполезной из-за единственного неверного шага.

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

В этой статье я буду использовать набор данных Kaggle Flat Earth on Twitter.

Примечание: функции, показанные в этой статье, представляют собой лишь крошечную часть всех возможностей различных объектов времени в Python и Pandas — те, которые я счел нужным представить во вступительном посте, просто чтобы дать представление о силе этих объектов. объекты. Я не хочу создавать впечатление, что это пределы темы — это было бы неправдой при любом натяжении воображения.

Временные метки

Pandas использует тип dtype datetime64 NumPy, объединенный с объектом datetime из стандартной библиотеки и timeseries scikit, чтобы обеспечить функциональные возможности для серии дат — и они также был расширен новыми функциями от Pandas (пожалуйста, перейдите по этой ссылке для документации).

В зависимости от данных, с которыми вы работаете, загрузка столбцов даты в DataFrames может превратить их в столбцы datetime, если Pandas удастся угадать тип данных, но иногда этого не происходит, как вы можете видеть ниже с помощью Столбец «user_created»:

Метод Pandas to_datetime можно использовать для преобразования значений:

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

В параметре формата вам необходимо указать формат даты вашего ввода с определенными кодами (в приведенном выше примере %m как месяц, %d как день и %Y как год). Полный список кодов этих форматов см. в документации по дате и времени.

to_datetime возвращает объект Timestamp: это основной элемент, в котором кодируются данные даты и времени.

НаТ

Точно так же, как у нас есть специальное «нулевое» значение для числовых типов (NaN), datetime имеет свое собственное значение, называемое NaT (не время). Мы можем столкнуться с этим значением, например, при преобразовании Noneв datetime или при преобразовании данных, которые не могут быть проанализированы, а метод pandas.to_datetime вызывается с параметром errors='coerce': это означает, что если фрагмент данных не может быть проанализирован, будет возвращен None (NaT).

В приведенных ниже примерах мы создаем объекты datetime из столбцов DataFrame. Первый со значениями None:

Второй с недопустимыми входными данными:

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

Свойства и методы даты и времени

Одной из причин, по которой работать с datetime — настоящее удовольствие, является огромное количество функциональных возможностей, заключенных в объектах. Связанные свойства и методы являются одними из следующих: мы все помним, как пытались построить логику в Excel, например, чтобы узнать больше о конкретной дате, не открывая календарь — с Pandas нам просто нужно получить доступ к этим свойствам — например, год, месяц или день:

Мы также можем получить доступ ко всему сегменту даты или времени с помощью методов date или time:

Интересно, какой день недели был датой? Свойство dayofweek поможет:

Обратите внимание, что в этом методе понедельник — это 0-й день.

Вы постоянно забываете, сколько дней в том или ином месяце? Вы защищены:

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

Предположим, вы хотите добавить название дня, когда каждый пользователь был создан в Твиттере, в наши данные о плоской Земле. Мы можем использовать метод day_name:

Нет «.dt» перед вызовом метода day_name: в этом не было бы необходимости, если бы мы вызывали его для одной отметки времени:

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

Существует множество методов и свойств, которые невозможно перечислить в одной статье: все подробности см. в Справочнике по API Pandas. Главный вывод: если вы думаете об умном способе извлечения информации о датах или серии дат, этот метод, вероятно, уже существует в Pandas, и вам просто нужно знать правильный метод или атрибут для использования.

Диапазоны дат

Иногда вместо работы с временными данными, определяемыми, например, активностью пользователя, вам необходимо использовать предопределенные периоды времени, последовательности временных меток с одинаковой частотой. Метод date_range возвращает диапазон меток времени с предопределенными датой начала, датой окончания, количеством периодов и периодичностью — из этих четырех вы должны указать ровно три, чтобы точно определить диапазон:

Обратите внимание, что параметр freq для частоты получил M для месяцев — как вы могли догадаться, существует множество этих так называемых псевдонимов смещения — от почасовой до частоты конца рабочего квартала (представьте себе это).

Если вам нужно, вы можете даже комбинировать эти псевдонимы — в приведенном ниже примере в качестве параметра freq используется «2H3T», что означает 2 часа и 3 минуты:

Эти диапазоны, конечно, можно использовать для создания серий в DataFrame, как и любой другой список или массив:

Частичное индексирование строк

Ряд или фрейм данных с индексом даты можно разбить на слайсы, используя даты и строки, которые преобразуются в отметки времени. Например, мы можем отфильтровать по определенному году:

Интервал лет также может быть нарезан:

И, конечно же, вы можете сузить данные до конкретной даты:

Установить объекты времени в качестве индекса, если ваш исходный DataFrame не был загружен с ним, легко — атрибут DataFrame.index можно заменить любым массивом, если его длина совпадает с количеством строк в ваших данных:

Теперь мы можем разбить данные по дате, также используя частичную индексацию:

В этом посте я сосредоточился на Timestamp, объекте данных, который, как мне кажется, является ядром функциональности даты и времени в pandas. Во второй части я продолжу исследовать, что временные ряды могут сделать для вас, изучая варианты метки времени, такие как Timedeltas, DateOffsets и Periods.