使用 MultiIndex with Time 进行子集化

Posted

技术标签:

【中文标题】使用 MultiIndex with Time 进行子集化【英文标题】:Subsetting using MultiIndex with Time 【发布时间】:2017-11-07 20:10:21 【问题描述】:

我是 Pandas 中 MultiIndex 的新手,但我遇到的情况可能会有所帮助。我有一个带有 MultiIndex(ON_SCENE 和 LAST)的 df,其结构如下:

                              ID                
ON_SCENE            LAST                                                    
2016-05-05 03:58:54 last1    1000            
2016-05-05 17:23:39 last1    1001             
2016-05-05 18:20:50 last1    1002             
2016-05-05 21:30:29 last2    1003           
2016-05-05 22:33:19 last2    1004  
2016-05-05 23:30:23 last3    1005
2016-05-06 00:08:34 last3    1006
2016-05-06 01:33:54 last3    1007

我想使用日期和姓氏对这些数据进行子集化:

df.loc[j.strftime('%Y-%m-%d'),Last_Name]

其中 j 是 datetime.date 类型,Last_Name 是带有姓氏的 str。不幸的是,我不断收到 KeyError。我也试过:

    df[j.strftime('%Y-%m-%d')]
    df[Last_Name]

但是这些也给了我一个 KeyErrors。不知道我做错了什么?

【问题讨论】:

【参考方案1】:
In [103]: x.loc[('2016-05-05', 'last2'), :]
Out[103]:
                             ID
ON_SCENE            LAST
2016-05-05 21:30:29 last2  1003
2016-05-05 22:33:19 last2  1004

或使用 pd.IndexSlice:

In [104]: idx = pd.IndexSlice

In [105]: x.loc[idx['2016-05-05':'2016-05-06', 'last3'], :]
Out[105]:
                             ID
ON_SCENE            LAST
2016-05-05 23:30:23 last3  1005
2016-05-06 00:08:34 last3  1006
2016-05-06 01:33:54 last3  1007

Pandas Documentation with examples

【讨论】:

谢谢!我忘了列。第一个对我有用并且最有意义(尽管,对于其他发现此问题的人,我收到了 lexsort 错误,要求我在解决方案生效之前运行 df.sort_index(inplace=True))。 @jtam,很高兴我能帮上忙。是的,Pandas 在使用切片时需要按字典顺序排序的索引...

以上是关于使用 MultiIndex with Time 进行子集化的主要内容,如果未能解决你的问题,请参考以下文章

需要 active_support/time_with_zone 后的 Time:Class 的未定义方法`zone`

Linux Time 命令导致多上下文 with 语句异常

我可以将 TIMESTAMP WITH TIME ZONE 或 TIMESTAMP WITH LOCAL TIME ZONE 映射到哪些 Java 数据类型?

Recover With Until Time fails With RMAN-20207 When Time Is Before Last RESETLOGS (Doc ID 159405.1)(示

使用 MultiIndex 过滤

在 PostgreSQL 中正确处理 TIME WITH TIME ZONE