удалить строки по интервалам времени pandas
Приветствую) Не могу найти как это сделать. есть такая вот таблица. Какой командой удалить можно строки которые поподают в интервал с 20:00 до 21:00?
Ответы (3 шт):
Автор решения: CrazyElf
→ Ссылка
Как-то так должно работать, хотя 21:00 тут останется, но принцип думаю понятен:
df = df.loc[(df.index.hour < 20) | (df.index.hour >= 21)]
Чтобы совсем точно сделать сравнение, сделайте так:
import datetime
df = df.loc[(df.index.time < datetime.time(20)) | (df.index.time > datetime.time(21))]
В целом смысл в том, что нужно не удалять не нужное, а наоборот - оставить только нужное, перезаписав DataFrame.
Автор решения: MaxU
→ Ссылка
Пример данных:
In [41]: df = pd.DataFrame(
...: {"val": np.random.randint(10, size=10)},
...: index=pd.date_range("2020-01-01 19:00:00", periods=10, freq="30T")
...: )
...:
In [42]: df
Out[42]:
val
2020-01-01 19:00:00 7
2020-01-01 19:30:00 6
2020-01-01 20:00:00 8
2020-01-01 20:30:00 2
2020-01-01 21:00:00 6
2020-01-01 21:30:00 9
2020-01-01 22:00:00 5
2020-01-01 22:30:00 2
2020-01-01 23:00:00 1
2020-01-01 23:30:00 7
решение для удаления дат из интервала [20:00, 21:00) (NOTE: правая граница интервала открытая):
res = df.query("index.dt.hour != 20")
результат:
In [59]: res
Out[59]:
val
date
2020-01-01 19:00:00 7
2020-01-01 19:30:00 6
2020-01-01 21:00:00 6
2020-01-01 21:30:00 9
2020-01-01 22:00:00 5
2020-01-01 22:30:00 2
2020-01-01 23:00:00 1
2020-01-01 23:30:00 7
Автор решения: MaxU
→ Ссылка
Вариант удаляющий даты с учетом обоих концов интервала - т.е. и 20:00 и 21:00 будут удалены из результата:
idxs = df.index.indexer_between_time(
"20:00",
"21:00",
include_start=True,
include_end=True)
res = df.iloc[pd.Index(np.arange(len(df))).difference(idxs)]
In [75]: res
Out[75]:
val
date
2020-01-01 19:00:00 7
2020-01-01 19:30:00 6
2020-01-01 21:30:00 9
2020-01-01 22:00:00 5
2020-01-01 22:30:00 2
2020-01-01 23:00:00 1
2020-01-01 23:30:00 7
