带索引和多级索引的Pandas数据框日期时间切片

10

使用单个索引的数据帧,我可以执行以下操作:

df2 = DataFrame(data={'data': [1,2,3]}, 
                index=Index([dt(2016,1,1),
                      dt(2016,1,2),
                      dt(2016,2,1)]))

>>> df2['2016-01 : '2016-01']
                data
    2016-01-01     1
    2016-01-02     2

>>> df2['2016-01-01' : '2016-01-01']
                data
    2016-01-01     1
当您提供完整的日期(即2016-01-01)时,日期时间切片起作用;当您只提供年份和月份(2016-01)时,也同样适用。所有这些都很好用,但是当您引入多索引时,它仅适用于完整日期。部分日期切片似乎不再起作用。
df = DataFrame(data={'data': [1, 2, 3]},
               index=MultiIndex.from_tuples([(dt(2016, 1, 1), 2),
                                             (dt(2016, 1, 1), 3),
                                             (dt(2016, 1, 2), 2)],
                                             names=['date', 'val']))


 >>> df['2016-01-01 : '2016-01-02']
                            data
     date       val     
     2016-01-01 2           1
                3           2
     2016-01-02 2           3

好的,没问题,但是部分日期:

>>> df['2016-01' : '2016-01']
 File "pandas/index.pyx", line 134, in pandas.index.IndexEngine.get_loc      (pandas/index.c:3824)
 File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:3704)
 File "pandas/hashtable.pyx", line 686, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12280)
 File "pandas/hashtable.pyx", line 694, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12231)
  KeyError: '2016-01'

(我缩短了traceback的长度)。

你知道这是否可能?这是一个错误吗?有没有办法在不使用类似于以下方式的方法的情况下完成我想做的事情:

df.loc[(df.index.get_level_values('date') >= start_date) &
       (df.index.get_level_values('date') <= end_date)]

非常感谢任何提示、评论、建议等!我已经尝试了很多其他方法,但都没有成功!


2
我认为在版本 0.18.0 中它不起作用,但在版本 0.18.1 中可以实现 - 请参见 - jezrael
2个回答

15

这似乎可以工作,但它会丢失多级索引。有没有办法保留索引? - Bryant
这将删除索引。 - mathtick
有一个 drop_level 参数(默认设置为 True)。 - IanS

13

使用pandas IndexSlice 可以获得更加优美的语法。

idx = pd.IndexSlice
df.loc[idx['2016-01-01':'2016-01-01', :], :]

请记住,pandas的切片是左右包含的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接