Просто чтобы уточнить: это , а не скользящий расчет. Вы упоминали, что пытались решить эту проблему, используя rolling
, но из вашего пояснения кажется, что вы хотите разделить временные ряды на дискретные, не перекрывающиеся 15-минутные последовательности.
Настройка
df = pd.DataFrame({
'Date': [
'2016-06-01 00:00:00.020', '2016-06-01 00:00:00.136',
'2016-06-01 00:15:00.636', '2016-06-01 00:15:02.836',
],
'Bid': [150, 150, 200, 200]
})
print(df)
Date Bid
0 2016-06-01 00:00:00.020 150
1 2016-06-01 00:00:00.136 150 # Should be dropped
2 2016-06-01 00:15:00.636 200
3 2016-06-01 00:15:02.836 200 # Should be dropped
Сначала убедитесь, что ваш столбец Date
равен datetime
:
df.Date = pd.to_datetime(df.Date)
Теперь используйте dt.floor
, чтобы округлить каждое значение до ближайших 15 минут, и используйте этот новый столбец до drop_duplicates
за 15-минутное окно, но сохраняйте точность ваших дат.
df.assign(flag=df.Date.dt.floor('15T')).drop_duplicates(['flag', 'Bid']).drop('flag', 1)
Date Bid
0 2016-06-01 00:00:00.020 150
2 2016-06-01 00:15:00.636 200
Из моего первоначального ответа, но я все еще верю, что он имеет значение. Если вы хотите получить доступ к уникальным значениям для каждой группы, вы можете использовать pd.Grouper
и unique
, и я считаю, что научиться использовать pd.Grouper
- это мощный инструмент для работы с pandas
:
df.groupby(pd.Grouper(key='Date', freq='15T')).Bid.unique()
Date
2016-06-01 00:00:00 [150]
2016-06-01 00:15:00 [200]
Freq: 15T, Name: Bid, dtype: object