Класс Resampler
Класс Resampler создается при вызове метода resample
на объекте DataFrame или Series с индексом времени.
Он позволяет изменять частоту дискретизации временных данных,
агрегируя или интерполируя значения. Объект Resampler
является итератором и предоставляет множество методов для
агрегации, аналогичных методам группировки. Основное его
назначение - преобразование временных рядов с одной частоты
на другую, например, с ежедневной на ежемесячную.
Синтаксис
resampler = df.resample(rule, axis=0, closed=None, label=None, convention='start', kind=None, loffset=None, base=None, on=None, level=None, origin='start_day', offset=None, group_keys=False)
Основные параметры метода resample:
-
rule- строка или объектDateOffset, задающий новую частоту (например, 'M' для месяца, 'D' для дня, 'H' для часа) -
axis- ось, по которой производится передискретизация (по умолчанию 0) -
closed- определяет, с какой стороны интервал является закрытым ('right' или 'left') -
label- определяет, какую сторону интервала использовать для маркировки ('right' или 'left') -
convention- для передискретизации с понижением частоты ('start' или 'end') -
on- имя столбца, который содержит временные метки -
level- имя или номер уровня индекса для передискретизации
Пример
Создадим временной ряд с ежедневной частотой и выполним передискретизацию с понижением частоты до ежемесячной с вычислением среднего значения:
import pandas as pd
date_rng = pd.date_range(start='2025-01-01', end='2025-03-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['a'] = range(1, len(df) + 1)
df.set_index('date', inplace=True)
res = df.resample('M').mean()
print(res)
Результат выполнения кода:
a
date
2025-01-31 16.0
2025-02-28 45.5
2025-03-31 74.0
Пример
Выполним передискретизацию с повышением частоты
с ежедневной на ежечасную, заполняя пропуски с
помощью метода ffill:
import pandas as pd
date_rng = pd.date_range(start='2025-01-01', periods=3, freq='D')
df = pd.DataFrame({'a': [10, 20, 30]}, index=date_rng)
resampler = df.resample('H')
res = resampler.ffill()
print(res)
Результат выполнения кода:
a
2025-01-01 00:00:00 10
2025-01-01 01:00:00 10
2025-01-01 02:00:00 10
2025-01-01 03:00:00 10
2025-01-01 04:00:00 10
... ...
2025-01-02 20:00:00 20
2025-01-02 21:00:00 20
2025-01-02 22:00:00 20
2025-01-02 23:00:00 20
2025-01-03 00:00:00 30
[49 rows x 1 columns]
Пример
Применим несколько агрегирующих функций одновременно
с помощью метода agg объекта Resampler:
import pandas as pd
date_rng = pd.date_range(start='2025-01-01', periods=10, freq='D')
df = pd.DataFrame({'a': [5, 3, 8, 2, 7, 1, 9, 4, 6, 3]}, index=date_rng)
resampler = df.resample('2D')
res = resampler.agg(['mean', 'sum', 'max', 'min'])
print(res)
Результат выполнения кода:
a
mean sum max min
date
2025-01-01 4.0 8 5 3
2025-01-03 5.0 10 8 2
2025-01-05 4.0 8 7 1
2025-01-07 6.5 13 9 4
2025-01-09 4.5 9 6 3
Пример
Пример использования объекта Resampler для
получения последнего значения в каждом периоде
с помощью метода last:
import pandas as pd
date_rng = pd.date_range(start='2025-01-01', periods=15, freq='D')
df = pd.DataFrame({'a': range(15)}, index=date_rng)
resampler = df.resample('W')
res = resampler.last()
print(res)
Результат выполнения кода:
a
date
2025-01-05 4
2025-01-12 11
2025-01-19 14
Пример
Объект Resampler поддерживает итерацию по
группам, аналогично объекту группировки:
import pandas as pd
date_rng = pd.date_range(start='2025-01-01', periods=6, freq='D')
df = pd.DataFrame({'a': [10, 20, 30, 40, 50, 60]}, index=date_rng)
resampler = df.resample('2D')
for name, group in resampler:
print(f"{name} -> {group['a'].tolist()}")
Результат выполнения кода:
2025-01-01 00:00:00 -> [10, 20]
2025-01-03 00:00:00 -> [30, 40]
2025-01-05 00:00:00 -> [50, 60]