pandas.Series.resample#

Series.resample(правило, axis=, closed=None, label=None, convention='start', kind=, on=None, level=None, origin='start_day', offset=None, group_keys=False)[источник]#

Передискретизация временных рядов.

Удобный метод для преобразования частоты и передискретизации временных рядов. Объект должен иметь индекс, похожий на дату (DatetimeIndex, PeriodIndex, или TimedeltaIndex), или вызывающая сторона должна передать метку datetime-подобного ряда/индекса в on/level ключевой параметр.

Параметры:
правилоDateOffset, Timedelta или str

Строка смещения или объект, представляющий целевое преобразование.

ось{0 или 'index', 1 или 'columns'}, по умолчанию 0

Какую ось использовать для повышающей или понижающей дискретизации. Для Series этот параметр не используется и по умолчанию равен 0. Должен быть DatetimeIndex, TimedeltaIndex или PeriodIndex.

Устарело с версии 2.0.0: Используйте frame.T.resample(…) вместо этого.

закрыт{‘right’, ‘left’}, по умолчанию None

Какая сторона интервала бина закрыта. По умолчанию 'left' для всех частотных смещений, кроме 'ME', 'YE', 'QE', 'BME', 'BA', 'BQE' и 'W', которые по умолчанию имеют 'right'.

метка{‘right’, ‘left’}, по умолчанию None

Какую метку границы интервала использовать для обозначения блока. По умолчанию 'left' для всех частотных смещений, кроме 'ME', 'YE', 'QE', 'BME', 'BA', 'BQE' и 'W', которые по умолчанию используют 'right'.

соглашение{‘start’, ‘end’, ‘s’, ‘e’}, по умолчанию ‘start’

Для PeriodIndex только, определяет, использовать ли начало или конец правило.

kind{‘timestamp’, ‘period’}, опционально, по умолчанию None

Передать 'timestamp' для преобразования результирующего индекса в DateTimeIndex или 'period' для преобразования в PeriodIndex. По умолчанию сохраняется исходное представление входных данных.

Устарело с версии 2.2.0: Явно преобразуйте индекс в желаемый тип.

наstr, optional

Для DataFrame столбец, используемый вместо индекса для ресемплинга. Столбец должен быть типа datetime.

уровеньstr или int, необязательно

Для MultiIndex, уровень (имя или номер) для использования при передискретизации. уровень должен быть datetime-подобным.

originTimestamp или str, по умолчанию ‘start_day’

Метка времени, по которой производится корректировка группировки. Часовой пояс источника должен совпадать с часовым поясом индекса. Если строка, должна быть одной из следующих:

  • ‘эпоха’: origin равно 1970-01-01

  • 'start': origin является первым значением временного ряда

  • 'start_day': origin является первым днем в полночь временного ряда

  • ‘end’: origin является последним значением временного ряда

  • ‘end_day’: origin является потолочной полночью последнего дня

Добавлено в версии 1.3.0.

Примечание

Действует только для частот тиков (т.е. фиксированных частот, таких как дни, часы и минуты, а не месяцы или кварталы).

смещениеTimedelta или str, по умолчанию None

Смещение timedelta, добавленное к началу отсчета.

group_keysbool, по умолчанию False

Включать ли ключи групп в результирующий индекс при использовании .apply() на ресемплированном объекте.

Добавлено в версии 1.5.0: Не указание group_keys сохранит поведение, зависящее от значений, из pandas 1.4 и более ранних версий (см. Примечания к выпуску pandas 1.5.0 для примеров).

Изменено в версии 2.0.0: group_keys теперь по умолчанию False.

Возвращает:
pandas.api.typing.Resampler

Resampler объект.

Смотрите также

Series.resample

Передискретизация Series.

DataFrame.resample

Передискретизировать DataFrame.

groupby

Группировать Series/DataFrame по отображению, функции, метке или списку меток.

asfreq

Переиндексировать Series/DataFrame с заданной частотой без группировки.

Примечания

См. руководство пользователя подробнее.

Чтобы узнать больше о строковых смещениях, см. эта ссылка.

Примеры

Начните с создания серии с 9 временными метками по одной минуте.

>>> index = pd.date_range('1/1/2000', periods=9, freq='min')
>>> series = pd.Series(range(9), index=index)
>>> series
2000-01-01 00:00:00    0
2000-01-01 00:01:00    1
2000-01-01 00:02:00    2
2000-01-01 00:03:00    3
2000-01-01 00:04:00    4
2000-01-01 00:05:00    5
2000-01-01 00:06:00    6
2000-01-01 00:07:00    7
2000-01-01 00:08:00    8
Freq: min, dtype: int64

Понизьте частоту дискретизации ряда до 3-минутных интервалов и просуммируйте значения меток времени, попадающих в интервал.

>>> series.resample('3min').sum()
2000-01-01 00:00:00     3
2000-01-01 00:03:00    12
2000-01-01 00:06:00    21
Freq: 3min, dtype: int64

Понизить частоту дискретизации ряда до 3-минутных интервалов, как выше, но маркировать каждый интервал с использованием правой границы вместо левой. Обратите внимание, что значение в интервале, используемое как метка, не включается в интервал, который оно маркирует. Например, в исходном ряду интервал 2000-01-01 00:03:00 содержит значение 3, но суммарное значение в передискретизированном блоке с меткой 2000-01-01 00:03:00 не включает 3 (если бы включал, суммарное значение было бы 6, а не 3).

>>> series.resample('3min', label='right').sum()
2000-01-01 00:03:00     3
2000-01-01 00:06:00    12
2000-01-01 00:09:00    21
Freq: 3min, dtype: int64

Чтобы включить это значение, закройте правую сторону интервала бина, как показано ниже.

>>> series.resample('3min', label='right', closed='right').sum()
2000-01-01 00:00:00     0
2000-01-01 00:03:00     6
2000-01-01 00:06:00    15
2000-01-01 00:09:00    15
Freq: 3min, dtype: int64

Повысить частоту выборки ряда до 30-секундных интервалов.

>>> series.resample('30s').asfreq()[0:5]   # Select first 5 rows
2000-01-01 00:00:00   0.0
2000-01-01 00:00:30   NaN
2000-01-01 00:01:00   1.0
2000-01-01 00:01:30   NaN
2000-01-01 00:02:00   2.0
Freq: 30s, dtype: float64

Повышает частоту дискретизации ряда до 30-секундных интервалов и заполняет NaN значения с использованием ffill метод.

>>> series.resample('30s').ffill()[0:5]
2000-01-01 00:00:00    0
2000-01-01 00:00:30    0
2000-01-01 00:01:00    1
2000-01-01 00:01:30    1
2000-01-01 00:02:00    2
Freq: 30s, dtype: int64

Повышает частоту дискретизации ряда до 30-секундных интервалов и заполняет NaN значения с использованием bfill метод.

>>> series.resample('30s').bfill()[0:5]
2000-01-01 00:00:00    0
2000-01-01 00:00:30    1
2000-01-01 00:01:00    1
2000-01-01 00:01:30    2
2000-01-01 00:02:00    2
Freq: 30s, dtype: int64

Передайте пользовательскую функцию через apply

>>> def custom_resampler(arraylike):
...     return np.sum(arraylike) + 5
...
>>> series.resample('3min').apply(custom_resampler)
2000-01-01 00:00:00     8
2000-01-01 00:03:00    17
2000-01-01 00:06:00    26
Freq: 3min, dtype: int64

Для Series с PeriodIndex, ключевое слово соглашение можно использовать для управления использованием начала или конца правило.

Передискретизировать год по кварталам с использованием 'start' соглашение. Значения назначаются на первый квартал периода.

>>> s = pd.Series(
...     [1, 2], index=pd.period_range("2012-01-01", freq="Y", periods=2)
... )
>>> s
2012    1
2013    2
Freq: Y-DEC, dtype: int64
>>> s.resample("Q", convention="start").asfreq()
2012Q1    1.0
2012Q2    NaN
2012Q3    NaN
2012Q4    NaN
2013Q1    2.0
2013Q2    NaN
2013Q3    NaN
2013Q4    NaN
Freq: Q-DEC, dtype: float64

Передискретизация кварталов по месяцам с использованием 'end' соглашение. Значения присваиваются последнему месяцу периода.

>>> q = pd.Series(
...     [1, 2, 3, 4], index=pd.period_range("2018-01-01", freq="Q", periods=4)
... )
>>> q
2018Q1    1
2018Q2    2
2018Q3    3
2018Q4    4
Freq: Q-DEC, dtype: int64
>>> q.resample("M", convention="end").asfreq()
2018-03    1.0
2018-04    NaN
2018-05    NaN
2018-06    2.0
2018-07    NaN
2018-08    NaN
2018-09    3.0
2018-10    NaN
2018-11    NaN
2018-12    4.0
Freq: M, dtype: float64

Для объектов DataFrame, ключевое слово на может использоваться для указания столбца вместо индекса для ресемплинга.

>>> d = {'price': [10, 11, 9, 13, 14, 18, 17, 19],
...      'volume': [50, 60, 40, 100, 50, 100, 40, 50]}
>>> df = pd.DataFrame(d)
>>> df['week_starting'] = pd.date_range('01/01/2018',
...                                     periods=8,
...                                     freq='W')
>>> df
   price  volume week_starting
0     10      50    2018-01-07
1     11      60    2018-01-14
2      9      40    2018-01-21
3     13     100    2018-01-28
4     14      50    2018-02-04
5     18     100    2018-02-11
6     17      40    2018-02-18
7     19      50    2018-02-25
>>> df.resample('ME', on='week_starting').mean()
               price  volume
week_starting
2018-01-31     10.75    62.5
2018-02-28     17.00    60.0

Для DataFrame с MultiIndex, ключевое слово уровень может использоваться для указания уровня, на котором должно происходить ресемплирование.

>>> days = pd.date_range('1/1/2000', periods=4, freq='D')
>>> d2 = {'price': [10, 11, 9, 13, 14, 18, 17, 19],
...       'volume': [50, 60, 40, 100, 50, 100, 40, 50]}
>>> df2 = pd.DataFrame(
...     d2,
...     index=pd.MultiIndex.from_product(
...         [days, ['morning', 'afternoon']]
...     )
... )
>>> df2
                      price  volume
2000-01-01 morning       10      50
           afternoon     11      60
2000-01-02 morning        9      40
           afternoon     13     100
2000-01-03 morning       14      50
           afternoon     18     100
2000-01-04 morning       17      40
           afternoon     19      50
>>> df2.resample('D', level=0).sum()
            price  volume
2000-01-01     21     110
2000-01-02     22     140
2000-01-03     32     150
2000-01-04     36      90

Если вы хотите настроить начало интервалов на основе фиксированной временной метки:

>>> start, end = '2000-10-01 23:30:00', '2000-10-02 00:30:00'
>>> rng = pd.date_range(start, end, freq='7min')
>>> ts = pd.Series(np.arange(len(rng)) * 3, index=rng)
>>> ts
2000-10-01 23:30:00     0
2000-10-01 23:37:00     3
2000-10-01 23:44:00     6
2000-10-01 23:51:00     9
2000-10-01 23:58:00    12
2000-10-02 00:05:00    15
2000-10-02 00:12:00    18
2000-10-02 00:19:00    21
2000-10-02 00:26:00    24
Freq: 7min, dtype: int64
>>> ts.resample('17min').sum()
2000-10-01 23:14:00     0
2000-10-01 23:31:00     9
2000-10-01 23:48:00    21
2000-10-02 00:05:00    54
2000-10-02 00:22:00    24
Freq: 17min, dtype: int64
>>> ts.resample('17min', origin='epoch').sum()
2000-10-01 23:18:00     0
2000-10-01 23:35:00    18
2000-10-01 23:52:00    27
2000-10-02 00:09:00    39
2000-10-02 00:26:00    24
Freq: 17min, dtype: int64
>>> ts.resample('17min', origin='2000-01-01').sum()
2000-10-01 23:24:00     3
2000-10-01 23:41:00    15
2000-10-01 23:58:00    45
2000-10-02 00:15:00    45
Freq: 17min, dtype: int64

Если вы хотите настроить начало бинов с помощью смещение Timedelta, следующие две строки эквивалентны:

>>> ts.resample('17min', origin='start').sum()
2000-10-01 23:30:00     9
2000-10-01 23:47:00    21
2000-10-02 00:04:00    54
2000-10-02 00:21:00    24
Freq: 17min, dtype: int64
>>> ts.resample('17min', offset='23h30min').sum()
2000-10-01 23:30:00     9
2000-10-01 23:47:00    21
2000-10-02 00:04:00    54
2000-10-02 00:21:00    24
Freq: 17min, dtype: int64

Если вы хотите взять наибольший Timestamp как конец бинов:

>>> ts.resample('17min', origin='end').sum()
2000-10-01 23:35:00     0
2000-10-01 23:52:00    18
2000-10-02 00:09:00    27
2000-10-02 00:26:00    63
Freq: 17min, dtype: int64

В отличие от start_day, вы можете использовать end_day взять потолок полуночи наибольшего Timestamp в качестве конца интервалов и отбросить интервалы, не содержащие данные:

>>> ts.resample('17min', origin='end_day').sum()
2000-10-01 23:38:00     3
2000-10-01 23:55:00    15
2000-10-02 00:12:00    45
2000-10-02 00:29:00    45
Freq: 17min, dtype: int64