当索引是分层的时,Pandas时间序列索引失败

时间:2017-02-06 13:29:19

标签: pandas time-series

我尝试了以下代码段。

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()>切片()

你会给我一些帮助吗?

1 个答案:

答案 0 :(得分: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