Группа панд по времени с указанным временем начала с нецелыми минутами - PullRequest
0 голосов
/ 15 января 2019

У меня есть датафрейм с часами сигналов. Я хочу сгруппировать их в 10-минутные ведра. Проблема в том, что время начала не является «кратным» 10 минутам, поэтому вместо получения 6 групп я получаю 7 с первым и последним неполным.

Проблема может быть легко воспроизведена с помощью

import pandas as pd
import numpy as np
import datetime as dt

rng = pd.date_range('1/1/2011 00:05:30', periods=3600, freq='1S')
ts = pd.DataFrame({'a':np.random.randn(len(rng)),'b':np.random.randn(len(rng))}, index=rng)

interval = dt.timedelta(minutes=10)

ts.groupby(pd.Grouper(freq=interval)).apply(len)

2011-01-01 00:00:00    270
2011-01-01 00:10:00    600
2011-01-01 00:20:00    600
2011-01-01 00:30:00    600
2011-01-01 00:40:00    600
2011-01-01 00:50:00    600
2011-01-01 01:00:00    330
Freq: 10T, dtype: int64

Я попытался решить это, как описано здесь , но base занимает целое число минут. Для приведенного выше примера (начиная с 30 секунд после 00:05) приведенный ниже код по-прежнему не работает

ts.groupby(pd.Grouper(freq=interval, base=ts.index[0].minute)).apply(len)

Как я могу установить общее время запуска для Grouper? Мой ожидаемый результат здесь будет

2011-01-01 00:05:30    600
2011-01-01 00:15:30    600
2011-01-01 00:25:30    600
2011-01-01 00:35:30    600
2011-01-01 00:45:30    600
2011-01-01 00:55:30    600

1 Ответ

0 голосов
/ 15 января 2019

base принимает аргумент с плавающей точкой. В дополнение к минутам, вы также должны учитывать секунды.

base = ts.index[0].minute + ts.index[0].second/60
ts.groupby(pd.Grouper(freq=interval, base=base)).size()

2011-01-01 00:05:30    600
2011-01-01 00:15:30    600
2011-01-01 00:25:30    600
2011-01-01 00:35:30    600
2011-01-01 00:45:30    600
2011-01-01 00:55:30    600
Freq: 10T, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...