熊猫数据框中日期时间切片与指数多指标VS

问题描述:

对于单索引的数据帧,我可以做到以下几点:熊猫数据框中日期时间切片与指数多指标VS

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年1月1日),它当你给它一个部分日期时也是有效的,比如仅仅是年份和月份(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' 

(我缩短回溯)。

任何想法,如果这是可能的?这是一个错误?有没有办法做我想做的事情,而不必诉诸于类似:

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'版本中可以实现 - [见](https://pandas-docs.github.io/pandas-docs- travis/whatsnew.html#partial-string-indexing-on-datetimeindex-when-part-of-a-multiindex) – jezrael

横截面应该工作:

df.xs(slice('2016-01-01', '2016-01-01'), level='date') 

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

+0

似乎确实有效,但它会降低multiindex。任何方式来保存索引? – Bryant

+1

没关系,我看到有一个drop_level关键字arg! – Bryant

使用熊猫IndexSlice一个更pandtastic语法。

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

记得熊猫切片是左和右包括在内。