2016-04-14 25 views
3

vs Index ile Pandalar Dataframe datetime dilimleme: Tam bir DAY (yani 2016/01/01) burayı verinceben aşağıdakileri yapabilirsiniz tek endeksli dataframe ile MultiIndex

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 

Tarih saat çalışmalarını dilimleme ve bunu Ayrıca, sadece yıl ve ay gibi kısmi bir tarih verdiğinizde de çalışır (2016-01). Tüm bunlar harika çalışıyor, ancak bir çoklu endeksi tanıttığınız zaman, sadece tam tarihler için çalışıyor. Kısmi tarih dilimleme artık

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 

Tamam çalışmak için görünmüyor, ince bir şey, ama kısmi tarih:

>>> 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' 

(I Traceback kısaltılmış).

Bu mümkün mü? Bu bir hata mı? gibi bir şey başvurmak zorunda kalmadan yapmak istediğim şeyi yapmak için herhangi bir yolu var mı:

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

Herhangi bir ipucu, yorum, öneri, vb EN ÇOK takdir edilmektedir! Boşuna pek çok şey denedim!

+2

Sanırım 0.18.0 sürümünde işe yaramadı, ama '0.18.1' versiyonunda bu uygulanabilir - [bakınız] (https://pandas-docs.github.io/pandas-docs- travis/whatsnew.html # kısmi-string-indeksleme-datetimeindex-ne-parçası-of-a-multi-index) – jezrael

cevap

3

Kullanım pandalar daha pandtastic sözdizimi için IndexSlice.

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

Pandaların dilimlerinin sola ve sağa olduğunu unutmayın.

İlgili konular