7

在常规时间序列中,您可以及时将其向后或向前移动。

例如对于以下时间序列:

start = datetime(2012,1,1)
end = datetime(2012,4,1)
rng = pd.date_range(start,end)
ts = pd.Series(np.random.randn(len(rng)), index = rng)

我们可以改变它:

ts.shift(2, freq="D")

如何仅在一个级别上为 MultiIndex 时间序列执行此操作?

例如对于以下 MultiIndex 时间序列:

mi = [(dt,i) for dt in rng for i in range(5)]
ts_mi = pd.Series(np.random.randn(len(mi)), index = pd.MultiIndex.from_tuples(mi))

这可能看起来像:

2012-01-01  0   -0.805353
            1    1.467167
            2   -1.207204
            3    1.658394
            4    1.497559
2012-01-02  0   -0.742510
            1    0.764594
            2    0.558660
            3   -0.479370
            4    0.653849
...

使用它移动它ts_mi.shift(2, freq="D")

None   -0.805353
None    1.467167
None   -1.207204
None    1.658394
None    1.497559
None   -0.742510
None    0.764594
None    0.558660
None   -0.479370
None    0.653849
None   -0.138347
None    0.357479
None   -0.919202
None    1.300977
None   -0.360398
...
4

1 回答 1

6
ts_mi.unstack().shift(2, freq='D').stack()

可以看到输出是正确的:

utils.side_by_side(ts_mi, ts_mi.unstack().shift(2, freq='D').stack())
2012-01-01  0    0.481555    2012-01-03  0    0.481555
            1    0.000628                1    0.000628
            2    2.509266                2    2.509266
            3    0.021571                3    0.021571
            4   -0.539981                4   -0.539981
2012-01-02  0   -1.465450    2012-01-04  0   -1.465450
            1    0.815251                1    0.815251
            2   -1.489051                2   -1.489051
            3    0.639746                3    0.639746
            4   -0.176939                4   -0.176939
2012-01-03  0   -0.441842    2012-01-05  0   -0.441842
            1   -0.792810                1   -0.792810
            2   -0.802665                2   -0.802665
            3    1.922190                3    1.922190
            4    0.165446                4    0.165446
...                          ...                      

工作原理:df.unstack()将嵌套的 0、1、2、3、4 中的值移动到同音列,并df.stack()恢复原来的嵌套索引。

编辑:这是来自@Wes_McKinney 的 side_by_side 函数

def side_by_side(*objs, **kwds):
    from pandas.core.common import adjoin
    space = kwds.get('space', 4)
    reprs = [repr(obj).split('\n') for obj in objs]
    print adjoin(space, *reprs)
于 2012-10-23T13:31:16.120 回答