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