2017-02-06 21 views
1

Я пробовал следующий фрагмент кода.Индексация индексов индексирования Pandas терпит неудачу, когда индекс является иерархическим

In [84]: 
from datetime import datetime 
from dateutil.parser import parse 
​ 
rng = [datetime(2017,1,13), datetime(2017,1,14), datetime(2017,2,15), datetime(2017,2,16)] 
​ 
s = Series([1,2,3,4], index=rng) 
​s['2017/1'] 

Out[84]: 
2017-01-13 1 
2017-01-14 2 
dtype: int64 

Как я и ожидал, я мог бы успешно получать только те элементы, принадлежащие JAN лишь указать до JAN как с [ «2017/1»].

В следующий раз, я попробовал немного расширенную версию приведенной выше кода, где иерархический индекс был использован вместо того, чтобы:

from datetime import datetime 
from dateutil.parser import parse 

rng1 = [datetime(2017,1,1), datetime(2017,1,1), datetime(2017,2,1), datetime(2017,2,1)] 
rng2 = [datetime(2017,1,13), datetime(2017,1,14), datetime(2017,2,15), datetime(2017,2,16)] 

midx = pd.MultiIndex.from_arrays([rng1, rng2]) 

s = Series([1,2,3,4], index=midx) 

s['2017/1'] 

выше фрагмента кода, однако, порождает ошибка: TypeError: unorderable типов: int()> slice()

Не могли бы вы помочь?

ответ

1

Кажется, что это сложнее.

Partial string indexing on datetimeindex when part of a multiindex реализуется в DataFrame в pandas 0.18.

Так что, если использование:

rng1 = [pd.Timestamp(2017,5,1), pd.Timestamp(2017,5,1), 
     pd.Timestamp(2017,6,1), pd.Timestamp(2017,6,1)] 
rng2 = pd.date_range('2017-01-13', periods=2).tolist() + 
     pd.date_range('2017-02-15', periods=2).tolist() 
s = pd.Series([1,2,3,4], index=[rng1, rng2]) 
print (s) 
2017-05-01 2017-01-13 1 
      2017-01-14 2 
2017-06-01 2017-02-15 3 
      2017-02-16 4 

Тогда для меня работает:

print (s.to_frame().loc[pd.IndexSlice[:, '2017/1'],:].squeeze()) 
2017-05-01 2017-01-13 1 
      2017-01-14 2 
Name: 0, dtype: int64 

print (s.loc['2017/6']) 
2017-06-01 2017-02-15 3 
      2017-02-16 4 
dtype: int64 

Но это возвращение пустой Series:

print (s.loc[pd.IndexSlice[:, '2017/2']]) 
Series([], dtype: int64 
+0

Спасибо @jezrael! Просто использование .loc() отлично работает! Похоже, что серия с мультииндексисом больше не рассматривается как объект TimeSeries, хотя индекс содержит информацию о времени. Если бы это было так, индексирование в строку с использованием временной строки было бы законной операцией. Раньше я пытался использовать .ix(), но индексирование с помощью ix() терпит неудачу. Это все еще странно для меня. – Royalblue

+0

Теперь лучше не использовать ['ix'] (http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#deprecate-ix) Если мой ответ был полезен, не забудьте [принять ] (http://meta.stackexchange.com/a/5235/295067). Благодарю. – jezrael