Привести датафрейм к единому числу строк по дате pandas

Есть датафрейм вида:

                  Time  Open    High    Low     Close
  0 2019-12-30 05:50:00 1.12026 1.12051 1.12026 1.12036
  1 2019-12-30 05:55:00 1.12036 1.12037 1.12014 1.12027
  2 2019-12-30 06:00:00 1.12027 1.12029 1.12023 1.12029
  3 2019-12-30 06:05:00 1.12027 1.12028 1.12003 1.12006

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

  df.groupby('Time').size().unique()

выдаёт такой ответ:

 array([218, 265,  24, 288, 264, 285,  36, 252,  35, 276, 287], dtype=int64)

Передо мной 2 задачи:

  1. отобрать только те дни, наблюдения по которым начинаются с 00 часов 00 минут 00 секунд
  2. привести количество строк по каждому дню к единому числу - 218, то есть те дни, в которых количество строк меньше 218 - удалить, а те, где больше 218 - обрезать с конца до 218 строк

Ответы (1 шт):

Автор решения: strawdog

Я бы сделал так: Исходный датафрейм:

                 Time     Open     High      Low    Close  Volume
0 2019-12-30 05:50:00  1.12026  1.12051  1.12026  1.12036     189
1 2019-12-30 05:55:00  1.12036  1.12037  1.12014  1.12027     193
2 2019-12-30 06:00:00  1.12027  1.12029  1.12023  1.12029     113
3 2019-12-30 06:05:00  1.12027  1.12028  1.12003  1.12006     217
4 2019-12-30 06:10:00  1.12006  1.12021  1.12005  1.12019     143
...

Группируем и отбираем:

grp = df.groupby(df["Time"].dt.day)
res = pd.concat([group[:219] for index, group in grp if (group.iloc[0]["Time"].floor("D")==group.iloc[0]["Time"]) and len(group)>=218])

Тогда res будет:

                   Time     Open     High      Low    Close  Volume
507 2020-01-02 00:00:00  1.12188  1.12190  1.12178  1.12189     131
508 2020-01-02 00:05:00  1.12189  1.12189  1.12180  1.12182      98
509 2020-01-02 00:10:00  1.12183  1.12183  1.12161  1.12162     242
510 2020-01-02 00:15:00  1.12161  1.12169  1.12157  1.12161     190
511 2020-01-02 00:20:00  1.12161  1.12166  1.12157  1.12160     234
...
→ Ссылка