Срезы по датам в мультииндексах
Есть набор данных:
dates = ['2018-11-30 23:40:15', '2018-11-30 23:41:05',
'2018-11-30 23:41:15', '2018-12-01 00:08:57',
'2018-12-01 00:09:12', '2018-12-01 00:27:56',
'2018-12-01 00:28:56', '2018-12-01 00:39:37',
'2018-12-01 00:44:18', '2018-12-01 00:45:18']
dates = pd.to_datetime(dates)
ind = [['id_1','id_1','id_1','id_1','id_1',
'id_2', 'id_2', 'id_3', 'id_3', 'id_3'], dates]
df = pd.DataFrame(np.random.randn(10, 3), index=ind, columns=['col1', 'col2', 'col3'])
Знаю, что можно в индексе второго уровня указывать конкретную дату и получать все данные, соответствующие ей. Так:
df.loc['id_1', '2018-11-30']
Можно ли взять срез по дате и времени (например, выбрать все данные, с индексом id_1 до заданного времени включительно)?
Пытаюсь сделать так:
df.loc['id_1', :'2018-12-01 00:08:57']
или так, если до конкретного числа нужны данные:
df.loc['id_1', :'2018-12-01']
В итоге, выводятся сами индексы, а нужно DataFrame с данными до конкретного времени включительно, указанного в индексе.
Можно ли вообще делать таким образом срезы? Если да, то как?
Наглядный пример того, что имеется в виду:
df.loc['id_1', :'2018-12-01 00:08:57']
Ожидаю увидеть:
Ответы (2 шт):
попробуйте через срезы:
df.loc[(slice("id_1"), slice(None, '2018-12-01 00:08:57')), :]
Воспользуйтесь pd.IndexSlice - он специально создан для облегчения работы со срезами мульти-индексов:
In [32]: idx = pd.IndexSlice
In [33]: res = df.loc[idx['id_1', :'2018-12-01 00:08:57'], :]
In [34]: res
Out[34]:
col1 col2 col3
id_1 2018-11-30 23:40:15 -0.748932 -1.502318 0.593789
2018-11-30 23:41:05 1.451214 -0.943655 0.566013
2018-11-30 23:41:15 1.354764 0.044922 0.149455
2018-12-01 00:08:57 -0.946963 0.439159 1.503776
