Pandas & NumPy Academy · Урок

Извлечение временных признаков

Используйте аксессор .dt, чтобы извлечь из столбца datetime год, месяц, день, day_of_week и час для построения признаков.

Урок 4 из 413 шагов

«Извлечение временных признаков» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. DatetimeIndex и диапазоны периодов
  2. Ресэмплинг временных рядов
  3. Сдвиги и признаки запаздывания
  4. Извлечение временных признаков
← Назад к Pandas & NumPy Academy