Временные столбцы: парсинг, .dt-компоненты, длительности и фильтрация
Содержание курса
В прошлом уроке мы разбирали .str-аксессор — инструмент для поэлементной работы с текстовыми столбцами. Datetime-столбцы устроены по той же логике: сначала нужно привести данные к нужному типу, а затем работать через специальный аксессор. Начнём с первого шага — парсинга строк в datetime.
Парсинг строкового столбца в datetime через pd.to_datetime
Когда вы читаете CSV или получаете данные из базы, даты почти всегда приходят в виде строк: '2024-03-15', '2024-03-15 14:30:00' и тому подобное. Pandas не знает, что это дата — для него это просто object-столбец. Пока тип остаётся object, никакая временна́я арифметика и никакие .dt-компоненты не работают.
Есть два момента, когда обычно нужно явно преобразовывать тип. Первый — когда столбец уже загружен в DataFrame как строки (например, CSV прочитан без дополнительных параметров). В этом случае используют pd.to_datetime:
import pandas as pd
df = pd.DataFrame({
'event': ['A', 'B', 'C', 'D'],
'start_str': ['2024-01-10 08:00', '2024-02-15 09:30', '2024-03-05 14:00', '2024-04-20 07:00'],
'end_str': ['2024-01-10 10:30', '2024-02-16 09:30', '2024-03-05 18:00', '2024-04-21 07:00']
})
print(df['start_str'].dtype) # object
df['start'] = pd.to_datetime(df['start_str'])
df['end'] = pd.to_datetime(df['end_str'])
print(df['start'].dtype) # datetime64[ns]
pd.to_datetime принимает Series строк и возвращает новый Series с dtype datetime64[ns]. Исходный строковый столбец start_str при этом не трогается — результат кладётся в новый столбец start.
Второй момент — чтение CSV. Если вы знаете заранее, что столбец содержит даты, можно попросить pandas распарсить его прямо при загрузке через parse_dates:
# При чтении CSV: pandas сразу создаст datetime64[ns]-столбец
df = pd.read_csv('events.csv', parse_dates=['start', 'end'])
В этом случае pd.to_datetime не нужен — столбец уже будет нужного типа. Но если CSV уже загружен без parse_dates, или данные пришли не из файла, а из другого источника — pd.to_datetime это стандартный инструмент для преобразования.
Формат строки pandas распознаёт автоматически для распространённых вариантов: 'YYYY-MM-DD', 'YYYY-MM-DD HH:MM:SS', 'YYYY-MM-DD HH:MM' — всё это проходит без дополнительных настроек.
Типичная ошибка: .dt на строковом столбце
Если обратиться к .dt на столбце с dtype object, pandas бросит ошибку:
# Неверно: start_str имеет dtype object
print(df['start_str'].dt.year)
# AttributeError: Can only use .dt accessor with datetimelike values
Диагноз простой: проверьте df['start_str'].dtype. Если видите object — перед вами строки, и нужен pd.to_datetime. После преобразования df['start'].dtype покажет datetime64[ns], и аксессор заработает.
# Верно: сначала парсим, потом используем .dt
df['start'] = pd.to_datetime(df['start_str'])
print(df['start'].dt.year.tolist()) # [2024, 2024, 2024, 2024]
Правило: прежде чем использовать .dt или временну́ю арифметику, убедитесь, что столбец имеет dtype datetime64[ns] — через pd.to_datetime или parse_dates при чтении файла.
