У меня есть dataframe df, который выглядит следующим образом:
Start date Final date Value ID Serial
2022-09-01 01:09:07.093 2022-09-01 05:43:55.092999999 10.92 200 120
2022-09-01 01:14:07.093 2022-09-01 05:43:55.092999999 10.92 200 120
2022-09-01 01:19:07.093 2022-09-01 05:43:55.092999999 10.92 200 120
2022-09-01 01:13:07.093 2022-09-01 03:41:55.092999999 11.85 201 122
...
2022-09-02 01:19:07.093 2022-09-03 07:43:55.092999999 7.35 300 124
2022-09-02 01:24:07.093 2022-09-03 07:43:55.092999999 7.35 300 124
...
Для каждого совпадения «ID» и «Серийный номер» данные регистрируются каждые пять минут с «Дата начала» до «Дата окончания».
Я хочу передискретизировать этот фрейм данных каждые 15 минут и взять сумму «Значение». Мой основной подход был:
df = df.resample('15min', on='Start date')['Value'].sum()
Однако это учитывает каждое совпадение «ID» и «Serial» более одного раза за временной интервал. Я хочу передискретизировать фрейм данных, но с учетом только одного совпадения «ID» и «Serial» за 15-минутный промежуток.
Для данного примера вывод должен выглядеть следующим образом (поскольку «ID» и «Serial» повторяются, функция повторной выборки должна учитывать их только один раз за временной интервал):
Date Value
2022-09-01 01:00:00 22.70
2022-09-01 01:15:00 10.92
...
2022-09-02 01:15:00 7.35
...
Вместо этого я получаю на данный момент:
Date Value
2022-09-01 01:00:00 33.69
2022-09-01 01:15:00 10.92
...
2022-09-02 01:15:00 14.7
...
Примечание. Для каждого временного промежутка у меня есть много разных комбинаций «ID» и «Serial».
Вы можете использовать groupby.apply:
out = (df.groupby(pd.Grouper(freq='15T', key='Start date'))
.apply(lambda x: x.drop_duplicates(subset=['ID', 'Serial'])['Value'].sum())
)
Выход:
Start date
2022-09-01 01:00:00 22.77
2022-09-01 01:15:00 10.92
2022-09-01 01:30:00 0.00
2022-09-01 01:45:00 0.00
2022-09-01 02:00:00 0.00
...
2022-09-02 00:15:00 0.00
2022-09-02 00:30:00 0.00
2022-09-02 00:45:00 0.00
2022-09-02 01:00:00 0.00
2022-09-02 01:15:00 7.35
Freq: 15T, Length: 98, dtype: float64
Я только что отредактировал вопрос с дополнительной строкой данных, показывающей этот случай.
@OAP, понял, дай мне знать, если обновление работает для тебя
но если я удалю дубликаты, я потеряю все значения идентификатора и серийного номера, которые должны учитываться в другие промежутки времени, не так ли? проблема в том, что для каждого временного промежутка он должен учитываться только один раз. Но может быть так, что его нужно рассматривать в нескольких промежутках времени.