在 MultiIndex 上使用 Between_time() ?

Sea*_*igh 5 python pandas

假设我有一个带有 MultiIndex 的 DataFrame,如下所示:

                             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    ...  ...  ...  ...
...
Run Code Online (Sandbox Code Playgroud)

一旦我确定begend,我想使用 来df[].between_time(beg,end)从 DataFrame 中获取相关行。唯一的问题是,.between_time(beg,end)似乎只适用于 DateTimeIndex:

*** TypeError: Index must be DatetimeIndex
Run Code Online (Sandbox Code Playgroud)

或者是更合适的方式来做到这一点通过xs()

df.xs(slice(beg,end),level='tstp')
Run Code Online (Sandbox Code Playgroud)

Mar*_*nta 4

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

\n\n

选项1

\n\n

可能最好的方法是直接使用 DataFrame.loc 索引 MutliIndex

\n\n
df.loc[beg:end]\n
Run Code Online (Sandbox Code Playgroud)\n\n

选项2

\n\n

如果需要使用between_time,可以将unstack索引的第二级取出,然后使用between_time,最后stack返回第二级:

\n\n
df.unstack().between_time(beg,end).stack()\n
Run Code Online (Sandbox Code Playgroud)\n\n

选项3

\n\n

正如 IanS 提到的,xs会给你类似的结果:

\n\n
df.xs(slice(beg,end),level=\'tstp\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

结论

\n\n

第一个选项似乎是最干净也是最快的:

\n\n
>>> timeit df.loc[beg:end]\n1000 loops, best of 3: 317 \xc2\xb5s per loop\n\n>>> timeit df.unstack().between_time(beg,end).stack()\n100 loops, best of 3: 3.35 ms per loop\n\n>>> timeit df.xs(slice(beg,end),level=\'tstp\')\n1000 loops, best of 3: 632 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

此处为Jupyter 笔记本示例。

\n