DatetimeIndex и диапазоны периодов
Создавайте DatetimeIndex с помощью pd.date_range, разбирайте даты в строковом формате и задавайте столбец времени как индекс для доступа по времени.
«DatetimeIndex и диапазоны периодов» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Зачем Pandas нужны специальные инструменты для работы со временем
Для работы с данными временных рядов недостаточно просто хранить даты в виде строк. Вам потребуется сортировать данные по времени, выбирать диапазоны дат, изменять частоту выборки и извлекать такие компоненты, как месяц и день недели. Pandas решает эти задачи с помощью DatetimeIndex — индекса, состоящего из значений datetime64, который открывает доступ к специализированным операциям с учётом времени, недоступным для обычных целочисленных индексов или индексов из строк.
Создание DatetimeIndex с помощью pd.date_range()
pd.date_range(start, end, freq) создаёт последовательность дат с равными интервалами. Параметр freq задаёт интервал с помощью псевдонимов смещения: 'D' — день, 'h' — час, 'ME' — конец месяца, 'W' — неделя, 'YE' — конец года. Можно передать либо end, либо periods (количество временных меток), но не оба параметра одновременно.
import pandas as pd
# Daily dates for January 2024
dates = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')
print(dates)
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03',
# '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07'],
# dtype='datetime64[ns]', freq='D')
# 12 month-end dates
months = pd.date_range(start='2024-01-31', periods=12, freq='ME')
print(months[:3])Установка DatetimeIndex в DataFrame
Чтобы включить операции на основе времени, задайте столбец с датами как индекс DataFrame с помощью set_index() после преобразования его в datetime64 с помощью pd.to_datetime(). Когда индексом становится DatetimeIndex, вы можете использовать индексацию по неполному строковому представлению (df['2024-01']), выбирать срезы по диапазонам дат и применять все методы, учитывающие время.
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'value': [10, 15, 12]
})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df)
# value
# date
# 2024-01-01 10
# 2024-01-02 15
# 2024-01-03 12
print(type(df.index)) # DatetimeIndexИндексация по неполному строковому представлению даты
Одна из самых удобных возможностей DatetimeIndex — индексация по неполному строковому представлению даты. Вы можете выбирать строки по году, месяцу или дате, передавая неполную строку с датой в .loc[]. Например, df.loc['2024-01'] возвращает все строки за январь 2024 года, а df.loc['2024'] — все строки за 2024 год. Явно сравнивать значения столбцов не требуется.
# Create a larger date-indexed Series
s = pd.Series(
range(365),
index=pd.date_range('2024-01-01', periods=365, freq='D')
)
# Select all of January 2024
print(s.loc['2024-01'].shape) # (31,)
# Select a specific date range
print(s.loc['2024-03-01':'2024-03-07'])pd.to_datetime() для разбора дат
pd.to_datetime() преобразует строки, целые числа (временные метки Unix) или столбцы с датами в разных форматах в datetime64. Передайте format, чтобы указать точный шаблон, если даты имеют нестандартный формат (например, '%d/%m/%Y'). Используйте errors='coerce', чтобы преобразовать значения, которые невозможно разобрать, в NaT (неверное время) вместо возникновения ошибки.
# Parse standard ISO format
print(pd.to_datetime('2024-06-15'))
# Parse non-standard format
print(pd.to_datetime('15/06/2024', format='%d/%m/%Y'))
# Handle mixed/bad data gracefully
mixed = pd.to_datetime(['2024-01-01', 'bad_date', '2024-06-15'],
errors='coerce')
print(mixed) # NaT for 'bad_date'Аксессор .dt для компонентов даты и времени
Если столбец DataFrame (но не индекс) содержит значения datetime64, аксессор .dt предоставляет векторизованный доступ ко всем свойствам и методам даты и времени этого столбца. Используйте его, чтобы без циклов извлекать .dt.year, .dt.month, .dt.day, .dt.day_of_week, .dt.hour и другие компоненты. Если дата и время находятся в индексе, используйте непосредственно df.index.year.
df_col = pd.DataFrame({'date': pd.date_range('2024-01-01', periods=5, freq='D'),
'value': [10, 15, 12, 18, 14]})
df_col['year'] = df_col['date'].dt.year
df_col['month'] = df_col['date'].dt.month
df_col['dow'] = df_col['date'].dt.day_of_week # 0=Monday
df_col['week'] = df_col['date'].dt.isocalendar().week
print(df_col.head())Диапазоны периодов с помощью pd.period_range()
PeriodIndex представляет интервалы времени, а не конкретные временные метки. pd.period_range(start, periods, freq) создаёт месячные, квартальные или годовые периоды. Такой период, как Period('2024-01', 'M'), представляет весь январь 2024 года, а не только его дату начала. PeriodIndex полезен для финансовой отчётности, где используются кварталы или месяцы.
# Monthly periods
periods = pd.period_range('2024-01', periods=6, freq='M')
print(periods)
# PeriodIndex(['2024-01', '2024-02', '2024-03',
# '2024-04', '2024-05', '2024-06'],
# dtype='period[M]')
# Quarterly periods
quarters = pd.period_range('2024Q1', periods=4, freq='Q')
print(quarters) # [2024Q1, 2024Q2, 2024Q3, 2024Q4]Преобразование между временной меткой и периодом
Вы можете преобразовать DatetimeIndex в PeriodIndex с помощью to_period(freq), а затем вернуть его обратно с помощью to_timestamp(). Преобразование в периоды удобно, когда нужно обозначить строки месяцем или кварталом, а не конкретным днём. Это делает группировку и агрегацию более понятными при анализе по календарным периодам.
daily_idx = pd.date_range('2024-01-15', periods=5, freq='D')
print('DatetimeIndex:', daily_idx[:3])
# Convert to monthly periods
monthly_idx = daily_idx.to_period('M')
print('PeriodIndex:', monthly_idx[:3])
# PeriodIndex(['2024-01', '2024-01', ...], dtype='period[M]')
# Convert back to timestamps (start of period)
print(monthly_idx.to_timestamp()[:3])Работа с часовыми поясами
Реальные временные ряды часто содержат информацию о часовом поясе. Pandas поддерживает DatetimeIndex с часовым поясом с помощью tz_localize() (добавляет часовой пояс к временным меткам без часового пояса) и tz_convert() (преобразует временные метки между часовыми поясами). Всегда выполняйте внутреннюю обработку в UTC, а в местное время преобразуйте только при отображении, чтобы избежать ошибок из-за неоднозначности, связанной с переходом на летнее время.
naive = pd.date_range('2024-01-01', periods=3, freq='D')
print('Naive:', naive.tz)
# Attach timezone (localize)
utc = naive.tz_localize('UTC')
print('UTC:', utc)
# Convert to New York time
ny = utc.tz_convert('America/New_York')
print('NY:', ny[:2])Проверка и сортировка DatetimeIndex
Операции с временными рядами, такие как изменение частоты и выборка, требуют отсортированного DatetimeIndex (с монотонным возрастанием). Проверьте это с помощью df.index.is_monotonic_increasing и при необходимости выполните сортировку с помощью df.sort_index(). Неотсортированный DatetimeIndex может приводить к незаметным ошибкам или неожиданным результатам при изменении частоты и использовании оконных функций.
import numpy as np
df_unsorted = pd.DataFrame(
{'value': [10, 15, 12]},
index=pd.to_datetime(['2024-01-03', '2024-01-01', '2024-01-02'])
)
print('Sorted:', df_unsorted.index.is_monotonic_increasing) # False
df_sorted = df_unsorted.sort_index()
print('After sort:', df_sorted.index.is_monotonic_increasing) # True
print(df_sorted)Практический шаблон: создание DataFrame временного ряда
Ниже приведён полный шаблон создания DataFrame с индексом времени из исходных данных: разберите даты, установите индекс, отсортируйте его и проверьте частоту индекса. Эта настройка служит основой для всего последующего анализа временных рядов — изменение частоты, скользящие средние и признаки с запаздыванием используют чистый отсортированный DatetimeIndex.
import numpy as np
# Simulate loading raw data
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
df_ts = pd.DataFrame({'sales': np.random.randint(100, 500, 30)}, index=dates)
df_ts.index.name = 'date'
print('Shape:', df_ts.shape)
print('Freq:', df_ts.index.freq)
print('Sorted:', df_ts.index.is_monotonic_increasing)
print(df_ts.head())Быстрая проверка
Проверьте, насколько хорошо Вы поняли DatetimeIndex и диапазоны периодов из этого урока.
Итоги урока
В этом уроке Вы узнали, как создавать DatetimeIndex с помощью pd.date_range() и разбирать даты с помощью pd.to_datetime(), как использовать индексацию по частичной строке для интуитивного выбора дат, чем отличаются типы Timestamp и Period и как работать с часовыми поясами. Далее мы рассмотрим изменение частоты, чтобы менять частоту временного ряда.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «DatetimeIndex и диапазоны периодов» бесплатный?
Да — полный текст урока «DatetimeIndex и диапазоны периодов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «DatetimeIndex и диапазоны периодов»?
Создавайте DatetimeIndex с помощью pd.date_range, разбирайте даты в строковом формате и задавайте столбец времени как индекс для доступа по времени. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «DatetimeIndex и диапазоны периодов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- DatetimeIndex и диапазоны периодов
- Ресэмплинг временных рядов
- Сдвиги и признаки запаздывания
- Извлечение временных признаков