带有vs vs MultiIndex的Pandas Dataframe日期时间切片

Bry*_*ant 5 python datetime slice dataframe pandas

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

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

日期时间切片在您提供一整天(即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
Run Code Online (Sandbox Code Playgroud)

好的,那很好,但是部分日期:

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

(我缩短了追溯)。

知道这是否可行吗?这是错误吗?有什么办法可以做我想做的事而不必求助于:

df.loc[(df.index.get_level_values('date') >= start_date) &
       (df.index.get_level_values('date') <= end_date)]
Run Code Online (Sandbox Code Playgroud)

任何提示,评论,建议等,都将不胜感激!我尝试了很多其他事情都无济于事!

Ian*_*anS 5

横截面应该起作用:

df.xs(slice('2016-01-01', '2016-01-01'), level='date')
Run Code Online (Sandbox Code Playgroud)

文档:http : //pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html

  • 没关系,我看到有一个drop_level关键字arg! (2认同)

Lit*_*les 5

使用pandas IndexSlice可获得更泛泛的语法。

idx = pd.IndexSlice
df.loc[idx['2016-01-01':'2016-01-01', :], :])
Run Code Online (Sandbox Code Playgroud)

请记住,大熊猫片是左右包含的。