时间序列的移动
移动(shifting)是指沿着时间轴方向将数据进行前移或后移。Pandas对象中提供了一个shift()方法,用来前移或后移数据,但数据索引保持不变。shift()方法的语法格式如下:
shift(periods=1, freq=None, axis=0)
部分参数含义如下:
(1) periods:表示移动的幅度,可以为正数,也可以为负数,默认值是1,代表移动一次。
(2) freq:如果这个参数存在,那么会按照参数值移动时间戳索引,而数据值没有发生变化。
为了让读者更好地理解,下面以Series对象为例,通过一张图来描述向前移动与向后移动发生的变化,具体如图1所示。
图1 移动数据
在图1中,时间序列数据经过移动操作后,数据发生了变化,而时间戳索引没有发生任何变化。数据向前移动一次,位于最前面的数据被丢弃,位于末尾一行的数据因原数据向前移动变成了NaN;数据向后移动一次,位于末尾的数据被丢弃,位于开头一行的数据因原数据向后移动变为NaN。由此可见,数据由于前后移动出现了边界情况。
接下来,通过一个示例来演示如何让时间序列数据发生前移或后移,达到图7-1中展示的效果。
首先,创建一个使用DatetimeIndex作为索引的Series对象,示例代码如下。
In [28]: date_index = pd.date_range('2018/01/01', periods=5)
time_ser = pd.Series(np.arange(5) + 1, index=date_index)
time_ser
Out[28]:
2018-01-01 1
2018-01-02 2
2018-01-03 3
2018-01-04 4
2018-01-05 5
Freq: D, dtype: int32
然后,调用shift()方法时传入一个正数,这表明沿着纵轴方向移动一次,示例代码如下。
In [29]: # 向后移动一次
time_ser.shift(1)
Out[29]:
2018-01-01 NaN
2018-01-02 1.0
2018-01-03 2.0
2018-01-04 3.0
2018-01-05 4.0
Freq: D, dtype: float64
接着,调用shift()方法时传入一个负数,这表明沿着纵轴方向反方向移动一次,示例代码如下。
In [30]: # 向前移动一次
time_ser.shift(-1)
Out[30]:
2018-01-01 2.0
2018-01-02 3.0
2018-01-03 4.0
2018-01-04 5.0
2018-01-05 NaN
Freq: D, dtype: float64