Дата и время в Pandas и Python
В этом учебном пособии вы узнаете, как работать с датами, временем и DateTime в Pandas и Python. Работа с DateTime в Python и Pandas может быть сложной задачей. Это руководство направлено на то, чтобы упростить сложное, сосредоточившись на том, что вам нужно знать, чтобы начать и узнать достаточно, чтобы самостоятельно открыть для себя больше. Даты и время являются критически важными формами данных во многих областях, включая финансы, экономику, науку и многое другое.
К концу этого учебного пособия вы научитесь:
Эффективно загружать DateTime в Pandas
Получать доступ к атрибутам DateTime в Pandas
Фильтровать DataFrame Pandas на основе фильтров DateTime
Передискретизировать DataFrame Pandas на основе DateTime
Содержание
Импорт DateTime в DataFrame Pandas
Pandas интеллектуально обрабатывает значения DateTime при импорте набора данных в DataFrame. Библиотека попытается определить типы данных ваших столбцов при первом импорте набора данных. Например, давайте взглянем на очень простой набор данных, который выглядит следующим образом:
Вы можете найти файл здесь. Давайте попробуем импортировать набор данных в DataFrame Pandas и проверить типы данных столбцов.
Отлично! Похоже, что все работает хорошо. Но не так быстро – давайте проверим типы данных столбцов в наборе данных. Мы можем сделать это с помощью метода .info()
.
Мы видим, что тип данных столбца Date – object. Это означает, что данные хранятся как строки, что означает, что вы не можете получить доступ к множеству функциональных возможностей DateTime, доступных в Pandas.
Использование parse_dates Pandas для импорта DateTime
Один из простых способов импортировать данные как DateTime – использовать аргумент parse_dates=
. Аргумент принимает список столбцов, которые Pandas должен попытаться интерпретировать при чтении. Давайте попробуем добавить этот параметр в нашу команду импорта, а затем снова выведем информацию о нашем DataFrame:
Мы видим, что наш столбец теперь корректно импортирован в формате DateTime.
Использование to_datetime для преобразования столбцов в DateTime
Пример выше работал довольно хорошо, когда мы импортировали простой формат даты. Теперь давайте рассмотрим более сложный пример. Мы загрузим данные отсюда, которые выглядят следующим образом:
Когда мы передаем столбец Date, как мы делали ранее, Pandas не может интерпретировать формат даты. Давайте посмотрим, как это выглядит. Код ниже показывает, что дата фактически не была прочитана как формат DateTime, а продолжает существовать как строка.
Один из способов решить эту проблему – использовать функцию pd.to_datetime()
. Функция принимает серию данных и преобразует ее в формат DateTime. Мы можем настроить это, передав спецификацию формата, как структурированы даты.
Параметр format=
можно использовать для передачи этого формата. Коды формата следуют стандарту C 1989. Конечно, вероятно, вы не знаете стандарт C для дат наизусть. Полный список можно найти здесь, но таблица ниже раскладывает некоторые из наиболее важных.
%m
Месяц в виде числа с ведущими нулями
01, 02, 03, …
%B
Полное название месяца (в соответствии с локалью)
December, January, March
%y
Год без века в виде числа
01, 02, 22
%Y
Год с указанием
2001, 2002, 2022
%d
День месяца в виде числа с ведущими нулями.
01, 02, 03
%a
Сокращенное название дня недели
Mon, Tue, Wed
%A
День недели в виде полного имени в соответствии
Monday, Tuesday, Wednesday
%H
Час в формате 24-х часов как десятичное число.
12, 13, 14
%I
Час в формате 12-х часов как десятичное число.
12, 1, 2
%p
AM: до полудня PM: после полудня
AM, PM
Давайте посмотрим, как мы можем использовать эти коды формата для преобразования нашей строки в правильно отформатированный объект DateTime. Для этого мы передаем строку, используя знаки процента и любое другое форматирование точно так, как оно есть, включая пробелы и дефисы.
То, что мы сделали, – это передали Series в функцию .to_datetime()
вместе с форматом. Формат соответствует сложному шаблону и успешно преобразовал строку в объект DateTime.
Не всегда идеально преобразовывать столбец после загрузки DataFrame. Поэтому в следующем разделе вы узнаете, как передать форматтер в оператор импорта.
Использование date_parser для импорта сложных DateTime
Хотя вы всегда можете преобразовать столбец в объект DateTime после загрузки DataFrame, это может быть гораздо чище, если сделать это при загрузке DataFrame. Здесь на помощь приходит параметр date_parser=
. Этот параметр принимает функцию, которая инструктирует Pandas, как интерпретировать строку как объект DateTime.
Поскольку это функция, которую вы не будете использовать где-либо еще, это идеальный кандидат для анонимной лямбда-функции. Давайте создадим функцию и присвоим ее переменной parser
. Затем мы можем передать эту функцию в функцию .read_csv()
. Сама функция будет использовать метод .strptime()
, который преобразует строку в объект DateTime.
Функция опирается на импорт модуля datetime
из библиотеки datetime
. Функция принимает один аргумент, x
, и использует формат для преобразования строки в объект DateTime.
Атрибуты и методы DateTime в Pandas
Теперь, когда вы успешно импортировали свой DataFrame Pandas с правильно отформатированными датами, давайте узнаем, как можно использовать специальные атрибуты, которые появляются вместе с ними. Например, вы можете легко получить доступ к информации о дате и времени, такой как день недели, название месяца и многое другое. Это потому, что объект DateTime содержит гораздо больше информации, чем показывает его представление.
Атрибуты DateTime в Pandas
Давайте рассмотрим несколько из них. А именно, вы узнаете, как создать столбцы, содержащие день недели, квартал и час дня:
Под объектом DateTime скрывается множество данных! Это позволяет нам создавать сложные фильтры для DataFrame. К этим атрибутам можно получить доступ с помощью .dt
accessor, который очень похож на .str
accessor. Затем вы получаете доступ к векторизованным версиям значений DateTime.
Методы DateTime в Pandas
Аналогично, вы можете применять методы DateTime к своим столбцам DateTime. Они выглядят похоже на атрибуты, но включают функции вызова методов ()
. Причина, по которой они отличаются, заключается в том, что они представляют собой некоторую форму вычисления данных.
В приведенном выше примере вы использовали .dayofweek
accessor, чтобы получить числовое представление дня недели. Однако может быть полезно получить, например, название дня недели. Вы можете сделать это, используя метод .day_name()
, который возвращает строковое представление дня недели.
Аналогично, вы можете получить доступ к различным вычисляемым атрибутам. Например, вы можете вычислить самые большие и самые маленькие даты с помощью методов .max()
и .min()
. Давайте посмотрим, как это выглядит:
Вы можете пойти еще дальше и вычесть эти два значения. Это возвращает объект TimeDelta, который предоставляет представление различий в DateTime.
Это позволяет вам увидеть, что в нашем наборе данных есть диапазон в 20 дней!
Фильтрация DataFrame Pandas на основе DateTime
В этом разделе вы узнаете, как использовать DateTime Pandas для фильтрации DataFrame. Этот процесс интуитивно понятен и очень мощен. Чтобы максимально использовать это, лучше всего установить столбец Date в качестве индекса DataFrame. Вы можете сделать это с помощью метода df.set_index()
, который принимает столбец (или столбцы), который должен быть установлен в качестве нового индекса (или индексов).
Хотя это не выглядит сильно отличающимся от того, что было раньше, теперь это позволяет нам легко фильтровать наши данные. Помните, что индексация Pandas работает в формате [row, column]
. Поэтому мы можем просто передать DateTime, который хотим выбрать. Более того, мы можем просто передать часть даты, чтобы отфильтровать DataFrame. Давайте попробуем выбрать '2021-12-10'
.
Мы можем сократить это еще больше! Например, вы можете просто передать год (в формате 'yyyy'
) или части года-месяца ('yyyy-mm'
).
Предположим, вы хотите отфильтровать свой DataFrame, чтобы показать данные только за декабрь 2020. Аналогично, предположим, вы хотите увидеть только цену закрытия за этот месяц. Вы можете использовать .loc
accessor для фильтрации DataFrame:
Поскольку вы выбираете индекс (а не фильтруете данные), вы можете даже включать диапазоны индексов. Это работает путем включения данных в ваши диапазоны выбора индексов и разделения их с помощью двоеточия (:
). Давайте посмотрим, как вы можете выбрать только даты, охватывающие период с '2021-12-03'
по '2021-12-06'
:
В следующем разделе вы узнаете, как освоить более сложную тему: передискретизацию ваших данных.
Передискретизация DataFrame Pandas с использованием DateTime
Процесс передискретизации относится к изменению частоты ваших данных. У вас есть два основных метода, когда вы хотите передискретизировать свои временные ряды:
Увеличение частоты (upsampling): увеличение частоты ваших данных, например, от часов до минут
Уменьшение частоты (downsampling): уменьшение частоты ваших данных, например, от часов до дней
Оба метода требуют изобретения данных, так как точки данных фактически не существуют. В многих случаях метод, с помощью которого вы изобретаете эти данные, определяется логически. Например, при уменьшении частоты средних значений может иметь смысл вернуть среднее значение всех периодов. Если вы хотите вернуть уменьшенные максимальные значения, вы можете предоставить максимальное значение.
Данные в нашем наборе данных, вероятно, уже увеличены. Частота данных составляет один час, и, вероятно, она отслеживается на источнике гораздо чаще. Тем не менее, данные все еще довольно детализированы и показывают много вариаций в часовом приливе и отливе.
Метод .resample()
Pandas позволяет передискретизировать набор данных с временным индексом. Метод принимает периодичность, к которой вы хотите передискретизировать, например, 'W'
для недели или 'H'
для часа. Поскольку вам нужно предоставить метод, с помощью которого изобретаются ваши данные, вы можете применить другой метод, такой как .mean()
, чтобы передискретизировать с этой агрегационной функцией. Давайте передискретизируем наши часовые данные до ежедневных данных:
Здесь мы видим, что часовые данные были уменьшены до ежедневных данных.
Передискретизация временных рядов Pandas различными методами
В многих случаях вы не захотите передискретизировать свой DataFrame, используя один и тот же метод для каждого столбца. Например, вы можете захотеть передискретизировать столбец High Price
методом .max()
, а столбец Low Price
методом .min()
.
Это можно сделать, применив метод .agg()
к методу .resample()
. Метод .agg()
позволяет передать словарь, содержащий пары "ключ-значение" столбца и метода, который вы хотите использовать для агрегации. Давайте посмотрим, как мы можем передать разные методы для разных столбцов:
Вы можете видеть, что при передаче разных методов для каждого столбца наш набор данных получился совсем другим по сравнению с тем, где применялся только метод .mean()
! Это позволяет вам получить гораздо более тонкий контроль над своими данными!
Упражнения
Пришло время проверить ваше понимание! Попробуйте выполнить упражнения ниже. Если вам нужна помощь или вы хотите проверить свое решение, просто переключите раздел ниже.
Заключение и повторение
В этом учебном пособии вы узнали, как работать с DateTime в Pandas с Python! Раздел ниже предоставляет краткое повторение всего, что вы узнали:
Существует несколько способов парсинга дат и времени при загрузке вашего DataFrame. Если передача столбцов в параметр
parse_dates=
не работает, определите функцию парсера и передайте функцию в параметрdate_parser=
.Значения DateTime в Pandas имеют атрибуты и методы, к которым можно получить доступ с помощью
.dt
accessor.Значения DateTime можно передискретизировать, увеличивая или уменьшая их, чтобы обеспечить более высокую или более низкую детализацию в ваших наборах данных.
Дополнительные ресурсы
Чтобы узнать больше о связанных темах, ознакомьтесь с учебными пособиями ниже:
Преобразование Pandas Datetime в части даты (месяц, год и т.д)
Python Date to String: Python strftime Объяснение
Pandas: добавление дней в столбец дат
Создание диапазонов дат с помощью Pandas
Last updated