Я пытаюсь сгруппировать фрейм данных, содержащий дневные индикаторы, по периодам 30 дней, используя Grouper
:
import random
import pandas as pd
n_rows = 100
df = pd.DataFrame({"date": pd.date_range(periods=n_rows, end='2020-04-15'), "a": range(n_rows)})
aggregated = df.groupby(pd.Grouper(key="date", freq="30D")).sum().reset_index()
print(aggregated.date.max())
# out: Timestamp('2020-04-06 00:00:00')
Самая последняя дата aggregates
изменяется в зависимости от n_rows
: я хочу всегда быть последней датой исходного кадра данных, так что последним периодом является («2020-04-15» - 30D, «2020-04-15»). Я бы получил:
print(aggregated.date.max())
# out: Timestamp('2020-04-15 00:00:00')
Поскольку меня интересуют самые последние группы, мне все равно, как строится первая (самая старая) группа.
Я пробовал комбинации параметров label
, closed
, convention
, loffset
, base
(документация введите описание ссылки здесь ), но я не могу найти рабочее решение: - Мой первый подход был попыткой сделать верные периоды строятся в правильном направлении, используя label="right"
и closed="right"
и convention
, но ничего не работает:
aggregated = df.groupby(pd.Grouper(key="date", freq="30D", label="right", closed="right")).sum().reset_index()
print(aggregated.date.max())
# out: Timestamp('2020-04-16 00:00:00')
- Во-вторых, я попытался сместить группы, не влияя на происхождение date, используя параметры
loffset=f"{n_rows % 30}D"
и / или base=+/- n_rows % 30
, все еще ничего. - Наконец я попытался создать пользовательский объект
DateOffset
, но не смог найти рабочий пример с Grouper
.
Теперь мне интересно, возможно ли это, и с тех пор я немного удивлен.
Любое предложение или аналогичный пример, на который я мог бы взглянуть?
Спасибо!