Извлечение временных признаков
Используйте аксессор .dt, чтобы извлечь из столбца datetime год, месяц, день, day_of_week и час для построения признаков.
«Извлечение временных признаков» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Зачем извлекать временные признаки?
Исходный столбец datetime64 непрозрачен для большинства алгоритмов машинного обучения: они не понимают, что 2024-12-25 — праздничный день или что Friday приводит к росту розничных продаж. Создание временных признаков извлекает из столбцов с датой и временем значимые компоненты — год, месяц, день, день недели и час — в отдельные числовые или категориальные столбцы, с которыми модели и функции анализа могут работать напрямую.
Аксессор .dt
Если столбец DataFrame имеет тип datetime64, аксессор .dt предоставляет векторный доступ ко всем свойствам и методам даты и времени. Вместо применения функции Python к каждой строке по отдельности Вы пишете df['date'].dt.year, и Pandas вычисляет год для каждой строки за одну быструю операцию. Тот же аксессор работает со столбцами типа timedelta64, но предоставляет другие свойства.
import pandas as pd
df = pd.DataFrame({
'event_date': pd.date_range('2024-01-01', periods=8, freq='D'),
'revenue': [200, 350, 280, 310, 420, 380, 190, 260]
})
# Access datetime properties with .dt
print(df['event_date'].dt.year) # 2024 for all
print(df['event_date'].dt.month) # 1 for all
print(df['event_date'].dt.day[:5]) # 1, 2, 3, 4, 5Извлечение компонентов даты
Наиболее часто используемые свойства .dt для компонентов даты: .dt.year, .dt.month, .dt.day, .dt.day_of_week (0 — понедельник, 6 — воскресенье), .dt.day_of_year, .dt.week или .dt.isocalendar().week, .dt.quarter и .dt.days_in_month. Каждое из них возвращает Series целых чисел, которые можно использовать непосредственно как признаки.
df['year'] = df['event_date'].dt.year
df['month'] = df['event_date'].dt.month
df['day'] = df['event_date'].dt.day
df['day_of_week'] = df['event_date'].dt.day_of_week # 0=Mon
df['quarter'] = df['event_date'].dt.quarter
df['day_of_year'] = df['event_date'].dt.day_of_year
print(df[['event_date', 'year', 'month', 'day',
'day_of_week', 'quarter']].head())Извлечение компонентов времени
Для столбцов с датой и временем (а не только с датой) используйте .dt.hour, .dt.minute, .dt.second и .dt.microsecond. Они особенно важны для внутридневного анализа, моделирования поведения пользователей (например, закономерностей утром и вечером) и любых систем, где время суток влияет на целевую переменную.
df_ts = pd.DataFrame({
'timestamp': pd.date_range('2024-01-01', periods=6, freq='4h'),
'logins': [50, 200, 320, 280, 180, 90]
})
df_ts['hour'] = df_ts['timestamp'].dt.hour
df_ts['minute'] = df_ts['timestamp'].dt.minute
df_ts['date'] = df_ts['timestamp'].dt.date # Python date object
df_ts['time'] = df_ts['timestamp'].dt.time # Python time object
print(df_ts[['timestamp', 'hour', 'date']].head())Названия дней и месяцев
Для удобочитаемых подписей используйте .dt.day_name() и .dt.month_name(), чтобы получить строковые названия, например 'Monday' и 'January'. Они полезны для отображения в отчётах и создания категориальных признаков, отражающих влияние дня недели или месяца. Также можно передать locale, чтобы получить названия на других языках.
df['day_name'] = df['event_date'].dt.day_name()
df['month_name'] = df['event_date'].dt.month_name()
print(df[['event_date', 'day_name', 'month_name']].head(5))
# event_date day_name month_name
# 2024-01-01 Monday January
# 2024-01-02 Tuesday January
# 2024-01-03 Wednesday JanuaryПризнак выходного и рабочего дня
Очень распространённый признак — логический флаг, показывающий, приходится ли дата на выходной день. Выражение day_of_week >= 5 даёт True для субботы (5) и воскресенья (6). Для более сложных признаков производственного календаря numpy.busdaycalendar учитывает праздники, но в большинстве случаев простого разделения на будни и выходные достаточно, чтобы учесть основную часть эффекта.
df['is_weekend'] = df['event_date'].dt.day_of_week >= 5
df['is_weekday'] = ~df['is_weekend']
# Compare weekend vs weekday revenue
print(df.groupby('is_weekend')['revenue'].mean().round(1))
# is_weekend
# False 308.3 <- weekday average
# True 285.0 <- weekend averageПризнаки начала и конца периода
Аксессор .dt также предоставляет логические свойства, определяющие, находится ли дата в начале или конце периода: .dt.is_month_start, .dt.is_month_end, .dt.is_quarter_start, .dt.is_quarter_end, .dt.is_year_start и .dt.is_year_end. Они полезны для выявления отчётных периодов, циклов выставления счетов и сезонных эффектов на границах периодов.
dates_series = pd.Series(
pd.date_range('2024-01-28', periods=10, freq='D')
)
print(dates_series[dates_series.dt.is_month_start].values)
# ['2024-02-01']
print(dates_series[dates_series.dt.is_month_end].values)
# ['2024-01-31']Циклическое кодирование временных признаков
Месяц и час имеют циклическую природу: декабрь (12) близок к январю (1), а 23:00 — к 00:00. Представление их в виде линейных целых чисел (1–12 или 0–23) вводит большинство моделей в заблуждение. Кодируйте циклические признаки с помощью синусоидального и косинусоидального преобразований: sin(2π × value / max_value) и cos(2π × value / max_value). Так круговая структура представляется в двух числовых столбцах, которые модели могут корректно использовать.
import numpy as np
# Cyclical encoding for month (1-12)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)
# Cyclical encoding for day of week (0-6)
df['dow_sin'] = np.sin(2 * np.pi * df['day_of_week'] / 7)
df['dow_cos'] = np.cos(2 * np.pi * df['day_of_week'] / 7)
print(df[['month', 'month_sin', 'month_cos']].head().round(3))Арифметика с длительностями
Вычитание двух столбцов с датой и временем создаёт Series типа timedelta64. Аксессор .dt у Series с длительностями предоставляет .dt.days, .dt.seconds и .dt.total_seconds(). Это позволяет вычислять длительность событий, время с момента последней покупки и возраст в днях — всё в виде числовых столбцов, готовых для дальнейшего анализа.
df_orders = pd.DataFrame({
'order_date': pd.to_datetime(['2024-01-01', '2024-02-10', '2024-03-05']),
'delivery_date': pd.to_datetime(['2024-01-04', '2024-02-13', '2024-03-12'])
})
# Compute delivery time in days
df_orders['delivery_days'] = (
df_orders['delivery_date'] - df_orders['order_date']
).dt.days
print(df_orders)Использование свойств .dt у индекса
Если дата и время находятся в индексе DataFrame (DatetimeIndex), а не в столбце, обращайтесь к тем же свойствам непосредственно через индекс, без .dt: df.index.year, df.index.month, df.index.day_of_week и т. д. Их можно сразу добавить в виде новых столбцов: df['month'] = df.index.month.
df_indexed = df.set_index('event_date')
# Access components directly on the DatetimeIndex
print(df_indexed.index.month[:3]) # [1, 1, 1]
print(df_indexed.index.day_of_week[:3]) # [0, 1, 2]
# Add as new columns
df_indexed['month'] = df_indexed.index.month
df_indexed['weekday'] = df_indexed.index.day_of_week
print(df_indexed.head())Полный конвейер создания временных признаков
Ниже приведена полная функция создания временных признаков: она принимает DataFrame со столбцом даты и времени и возвращает его, дополнив наиболее полезными временными признаками. Этот шаблон можно применять в начале любого конвейера машинного обучения или анализа, работающего с данными событий, содержащими временные метки.
def add_temporal_features(df, date_col):
dt = df[date_col].dt
df['year'] = dt.year
df['month'] = dt.month
df['day'] = dt.day
df['day_of_week'] = dt.day_of_week
df['quarter'] = dt.quarter
df['is_weekend'] = dt.day_of_week >= 5
df['month_sin'] = (2 * 3.14159 * dt.month / 12).__round__(4)
df['month_cos'] = (2 * 3.14159 * dt.month / 12).__round__(4)
return df
result = add_temporal_features(df.copy(), 'event_date')
print(result.columns.tolist())Быстрая проверка
Проверьте, насколько хорошо Вы поняли извлечение временных признаков из столбцов с датой и временем.
Итоги урока
В этом уроке Вы узнали, что аксессор .dt предоставляет векторный доступ ко всем свойствам даты и времени; часто извлекаемые признаки включают год, месяц, день, day_of_week, час и квартал; циклическое кодирование с помощью синуса и косинуса учитывает циклическую природу часов и месяцев; а арифметика с длительностями позволяет вычислять продолжительность в днях или секундах. Далее мы рассмотрим архитектуру рисунков и областей построения Matplotlib для создания графиков, пригодных для публикации.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Извлечение временных признаков» бесплатный?
Да — полный текст урока «Извлечение временных признаков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Извлечение временных признаков»?
Используйте аксессор .dt, чтобы извлечь из столбца datetime год, месяц, день, day_of_week и час для построения признаков. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Извлечение временных признаков»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- DatetimeIndex и диапазоны периодов
- Ресэмплинг временных рядов
- Сдвиги и признаки запаздывания
- Извлечение временных признаков