【Pandas】pandas Series shift
Pandas2.2 Series
Time Series-related
方法 | 描述 |
---|---|
Series.asfreq(freq[, method, how, …]) | 用于将时间序列数据转换为指定的频率 |
Series.asof(where[, subset]) | 用于返回时间序列中指定索引位置的最近一个非缺失值 |
Series.shift([periods, freq, axis, …]) | 用于将时间序列数据沿指定轴移动指定的周期数 |
pandas.Series.shift
pandas.Series.shift
方法用于将时间序列数据沿指定轴移动指定的周期数。它可以用于向前或向后移动数据,并可以选择不同的填充方式来处理移出范围的数据。
详细描述
- 参数:
periods
: 整数,默认为1
。表示要移动的周期数。正值表示向后移动(即下移),负值表示向前移动(即上移)。freq
: 可选,频率偏移量。如果提供,则根据该频率进行时间戳的移动。axis
: 可选,默认为0
。表示沿哪个轴进行移动,对于Series
来说通常是0
。fill_value
: 可选,默认为None
。用于填充移出范围的数据。如果未提供,则默认使用NaN
。suffix
: 该参数在pandas.Series.shift
中无效,可能是其他方法中的参数,请忽略。
返回值
- 返回一个新的
Series
,其中数据已根据指定的周期数和频率进行了移动。
示例代码及结果
import pandas as pd
import numpy as np
# 创建一个带有日期索引的时间序列
dates = pd.date_range(start='2023-10-01', periods=5, freq='D')
s = pd.Series([1, 2, 3, 4, 5], index=dates)
print("原始 Series:")
print(s)
# 向后移动 2 个周期
s_shifted_2_periods = s.shift(periods=2)
print("\n向后移动 2 个周期后的 Series:")
print(s_shifted_2_periods)
# 向前移动 1 个周期,并用 0 填充移出范围的数据
s_shifted_neg1_fill0 = s.shift(periods=-1, fill_value=0)
print("\n向前移动 1 个周期并用 0 填充后的 Series:")
print(s_shifted_neg1_fill0)
# 根据频率移动时间戳
s_shifted_freq = s.shift(freq='2D')
print("\n根据频率 '2D' 移动时间戳后的 Series:")
print(s_shifted_freq)
输出结果
原始 Series:
2023-10-01 1
2023-10-02 2
2023-10-03 3
2023-10-04 4
2023-10-05 5
Freq: D, dtype: int64
向后移动 2 个周期后的 Series:
2023-10-01 NaN
2023-10-02 NaN
2023-10-03 1.0
2023-10-04 2.0
2023-10-05 3.0
Freq: D, dtype: float64
向前移动 1 个周期并用 0 填充后的 Series:
2023-10-01 2
2023-10-02 3
2023-10-03 4
2023-10-04 5
2023-10-05 0
Freq: D, dtype: int64
根据频率 '2D' 移动时间戳后的 Series:
2023-10-03 1
2023-10-04 2
2023-10-05 3
2023-10-06 4
2023-10-07 5
Freq: D, dtype: int64
结果解释
- 向后移动 2 个周期:
- 数据向下移动了 2 个位置,因此前两个位置是
NaN
,后续位置的数据依次下移。
- 数据向下移动了 2 个位置,因此前两个位置是
- 向前移动 1 个周期并用 0 填充:
- 数据向上移动了 1 个位置,因此最后一个位置用
0
填充,其他位置的数据依次上移。
- 数据向上移动了 1 个位置,因此最后一个位置用
- 根据频率 ‘2D’ 移动时间戳:
- 时间戳增加了 2 天,但数据保持不变,只是索引发生了变化。
这种方法非常适用于时间序列分析中需要对齐不同时间段的数据或进行滞后/超前分析的场景。