Привести датафрейм к единому числу строк по дате 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 задачи:
- отобрать только те дни, наблюдения по которым начинаются с 00 часов 00 минут 00 секунд
- привести количество строк по каждому дню к единому числу - 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
...