Python 在多索引上使用between_time()?

Python 在多索引上使用between_time()?,python,pandas,Python,Pandas,假设我有一个具有多索引的数据帧,如下所示: col col col col ... tstp pkt 2016-04-14 04:05:32.321 0 ... ... ... ... 25 ... ... ... ... 2

假设我有一个具有多索引的数据帧,如下所示:

                             col  col  col  col ...
tstp                    pkt                                                   
2016-04-14 04:05:32.321 0    ...  ...  ...  ...
                        25   ...  ...  ...  ...
2016-04-14 04:05:32.322 1    ...  ...  ...  ...   
                        26   ...  ...  ...  ...  
2016-04-14 04:05:32.374 2    ...  ...  ...  ...
...
一旦我确定了
beg
end
,我想使用
df[].between_time(beg,end)
从数据帧中获取相关行。唯一的问题是,
.between\u time(beg,end)
似乎只对DateTimeIndex起作用:

*** TypeError: Index must be DatetimeIndex
还是通过
xs()
实现这一点更合适


有多种方法可以获得您想要的结果:

选择1 最好的方法可能是使用
DataFrame.loc
直接索引到
多索引

df.loc[beg:end]
选择2 如果需要使用
interval\u time
,可以
取消堆叠
索引的第二级,然后使用
interval\u time
并最后
堆叠
返回第二级:

df.unstack().between_time(beg,end).stack()
选择3 正如IanS所提到的,
xs
将给出类似的结果:

df.xs(slice(beg,end),level='tstp')
结论 第一个选项看起来是最干净也是最快的:

>>> timeit df.loc[beg:end]
1000 loops, best of 3: 317 µs per loop

>>> timeit df.unstack().between_time(beg,end).stack()
100 loops, best of 3: 3.35 ms per loop

>>> timeit df.xs(slice(beg,end),level='tstp')
1000 loops, best of 3: 632 µs per loop

Jupyter笔记本示例。

df.xs(slice(beg,end),level='tstp')有什么问题吗?我看到的唯一替代方法是将
pkt
放入一个常规列,在两个时间之间应用
,然后将
pkt
移回索引。@IanS我想没有问题。那肯定是现在最好的方法。很明显,从熊猫18.1开始,多索引。感谢你做的分析;我正在处理一个大型数据集,其中性能是一个问题。不客气。我添加了一个链接到我用来测试选项的Jupyter笔记本。如果你想自己多挖一点,看看这个。
>>> timeit df.loc[beg:end]
1000 loops, best of 3: 317 µs per loop

>>> timeit df.unstack().between_time(beg,end).stack()
100 loops, best of 3: 3.35 ms per loop

>>> timeit df.xs(slice(beg,end),level='tstp')
1000 loops, best of 3: 632 µs per loop