Самыми коварными ошибками аналитиков являются не ошибки в коде, а те случаи, когда с точки зрения синтаксиса код работает корректно, но выдает не тот результат, который вы ожидаете.
На больших объемах данных такие ошибки иногда сложно заметить, но они могут сыграть очень злую шутку, если неверный отчет упадет на стол руководителю и он примет на основе неверных данных неверные решения.
Одним из ярких примеров таких ошибок является особенность обработки дат библиотекой pandas. В данной статье будут приведены примеры правильного и неправильного чтения дат из файлов csv.
Для нашего примера и для простоты восприятия информации приведен небольшой датасет (набор данных), который состоит из трех строчек и двух столбцов, содержащих id заказа (order_id) и дату создания заказа (order_created_date).
Наши исходные данные в формате csv выглядят следующим образом:
Обратите внимание, что даты создания заказов – это 1, 2, 3 мая.
Далее мы прочитаем наш набор данных при помощи функции read_csv библиотеки pandas.
import pandas as pd # импорт библиотеки
df = pd.read_csv('test_data.csv') # чтение файла (название нашего файла test_data.csv)
Результат выполнения кода будет следующим:
Но здесь есть небольшой нюанс, который заключается в том, что датам присвоен тип данных object. А это означает, что мы не сможем применять функции работы с датами для данного столбца (например, не получится извлечь из дат день недели или год, если нам потребуется это сделать).
Типы данных датафрейма мы можем проверить при помощи метода dtypes.
Результат работы кода (проверки типов данных) приведен ниже:
Для того чтобы явно указать, что мы хотим читать даты как даты, нам требуется указать при чтении файла параметр parse_dates, а внутри него в фигурных скобках перечислить список столбцов, которые мы хотим читать как даты. В нашем случае столбец с датами один и называется order_created_date.
Ниже пример кода, который выполняет чтение файла csv с параметром parse_dates.
df = pd.read_csv('test_data.csv', parse_dates=['order_created_date'])
Результат выполнения кода представлен ниже. И тут нас ждет коварная ошибка: наши даты изменились (в исходных данных все даты были в мае, сейчас у нас день перепутался с месяцем местами).
Результат вывода датафрейма:
Это связано с тем, что на родине pandas, в США, стандартным форматом написания дат является MM/DD/YY.
Чтобы явно указать библиотеке pandas, что первым в дате является день, нужно указать параметр dayfirst со значением True.
Пример кода приведен ниже:
df = pd.read_csv('test_data.csv', parse_dates=['order_created_date'], dayfirst=True)
Результат вывода фатафрейма:
Для чтения файлов Excel в pandas предусмотрена функция read_excel.
При чтении эксель-файлов автоматическое чтение и интерпретация дат происходят корректно. Пример кода и исходные данные представлены ниже.
Исходные данные в Excel:
Чтение эксель-файла:
df = pd.read_excel('test_data.xlsx')
Даты интерпретировались корректно (результат вывода датафрейма):
Типы данных также автоматически определились корректно (результат проверки типов данных):
В данной части статьи был рассмотрен лишь один пример работы с датами в pandas. Различных методов работы с датами и их преобразования множество, поэтому для описания всех нюансов и подходов потребуется целая книга.
Совет аналитикам: перепроверяйте результат работы кода, чтобы избежать неочевидных ошибок, но не расстраивайтесь, если их совершили – опыт приходит через совершение ошибок, их поиск и исправление.
А теперь давайте рассмотрим пример решения прикладной задачи: выгрузим данные из Яндекс Метрики, откроем выгруженный файл при помощи pandas, отфильтруем его и преобразуем даты в формат datetime.
Для примера возьмем отчет «Посещаемость» с детализацией по дням.
Выгрузим отчет в формат csv:
Обратите внимание, что строка «Итого и среднее» тоже выгрузилась в наш файл csv, но для анализа данных она нам не нужна, поэтому при помощи pandas мы ее удалим.
Вот так выглядят исходные данные в формате csv. Синим выделена строка, которую необходимо удалить.
Ниже приведен код, который читает наш файл, удаляет строку «Итого и среднее», преобразовывает столбец «Интервал дат визита» в формат datetime и переименовывает его в «Дата».
import pandas as pd # Импорт библиотеки
df = pd.read_csv('Посещаемость.csv')[1:] # Читаем файл, командой [1:] избавляемся от стройки "Итого и среднее"
df['Интервал дат визита'] = pd.to_datetime(df['Интервал дат визита']) # преобразовываем столбец "Интервал дат визита" в формат datetime
df = df.rename(columns={'Интервал дат визита': 'Дата'}) # Переименовываем столбец "Интервал дат визита" в "Дата"
df # Выводим датафрейм
Результат выполнения кода:
Обратите внимание, что в данном случае мы не использовали параметр dayfirst, так как даты в исходном файле имеют формат ГГ/ММ/ДД, поэтому они интерпретируются правильно, а использование параметра dayfirst в данном случае приведет к ошибке работы кода.











