首页Python【Python数据分析】5...

【Python数据分析】57.时间序列——移位(前向和后向)日期


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

1.移位(Shifting):

移位(Shifting)是指将日期按时间向前或向后移动。Series 和 DataFrame 都有一个 shift 方法,用于向前或向后进行简单的移位,而不改变索引:

当我们这样移位时,会在时间序列的开始或结束位置引入缺失值。

 1>>> ts = pd.Series(np.arange(1,6) , index=pd.date_range("2022-12-12" , periods=5))
2>>> ts
32022-12-12    1
42022-12-13    2
52022-12-14    3
62022-12-15    4
72022-12-16    5
8Freq: D, dtype: int32
9
10>>> ts.shift(2)
112022-12-12    NaN
122022-12-13    NaN
132022-12-14    1.0
142022-12-15    2.0
152022-12-16    3.0
16Freq: D, dtype: float64
17
18>>> ts.shift(-2)
192022-12-12    3.0
202022-12-13    4.0
212022-12-14    5.0
222022-12-15    NaN
232022-12-16    NaN
24Freq: D, dtype: float64

shift 的一个常见用途是计算时间序列或DataFrame 多列时间序列的百分比变化:

1>>> ts / ts.shift(1) - 1
22022-12-12         NaN
32022-12-13    1.000000
42022-12-14    0.500000
52022-12-15    0.333333
62022-12-16    0.250000
7Freq: D, dtype: float64

1.1 传递频率以推移时间戳:

由于简单的移位不会改变索引,一些数据会被丢弃。因此,如果频率已知,则可以将其传递给 shift 以推移时间戳,而不仅仅是数据:

 1>>> ts
22022-12-12    1
32022-12-13    2
42022-12-14    3
52022-12-15    4
62022-12-16    5
7Freq: D, dtype: int32
8
9
10>>> ts.shift(2 , freq="D")
112022-12-14    1
122022-12-15    2
132022-12-16    3
142022-12-17    4
152022-12-18    5
16Freq: D, dtype: int32

也可以传递其他频率,让你可以灵活地移位数据:

 1>>> ts.shift(2 , freq="1h30min")
22022-12-12 03:00:00    1
32022-12-13 03:00:00    2
42022-12-14 03:00:00    3
52022-12-15 03:00:00    4
62022-12-16 03:00:00    5
7Freq: D, dtype: int32
8
9# 这里的 T 代表分钟。
10>>> ts.shift(2,freq="90T")
112022-12-12 03:00:00    1
122022-12-13 03:00:00    2
132022-12-14 03:00:00    3
142022-12-15 03:00:00    4
152022-12-16 03:00:00    5
16Freq: D, dtype: int32

需要注意的是,freq 参数指示应用于时间戳的偏移量,但它不会更改数据的基础频率(如果有)。

2.使用偏置移位日期:

pandas 日期偏量也可以使用 datetimeTimestamp 对象:

1>>> from pandas.tseries.offsets import Day , MonthEnd
2>>> from datetime import datetime
3
4>>> now = datetime(2022,12,12)
5>>> now + 3*Day()
6Timestamp('2022-12-15 00:00:00')

如果添加像 MonthEnd 这样的锚定偏置量,第一个增量将根据频率规则将日期“前滚”到下一个日期:

1>>> now + MonthEnd()
2Timestamp('2022-12-31 00:00:00')
3
4>>> now + MonthEnd(2)
5Timestamp('2023-01-31 00:00:00')

锚定的偏置量可以使用 rollforwardrollback 方法将日期显式地向前或向后“滚动”:

1>>> offset = MonthEnd()
2
3>>> offset.rollforward(now)
4Timestamp('2022-12-31 00:00:00')
5
6>>> offset.rollback(now)
7Timestamp('2022-11-30 00:00:00')

3.将移位方法与 groupby 一起使用:

将移位方法与 groupby 一起使用是日期偏置的一种创造性用法。

例如:

 1>>> ts = pd.Series(np.arange(20) , index=pd.date_range("2022-12-12" , periods=20 , freq="4D"))
2>>> ts
32022-12-12     0
42022-12-16     1
52022-12-20     2
62022-12-24     3
72022-12-28     4
82023-01-01     5
92023-01-05     6
102023-01-09     7
112023-01-13     8
122023-01-17     9
132023-01-21    10
142023-01-25    11
152023-01-29    12
162023-02-02    13
172023-02-06    14
182023-02-10    15
192023-02-14    16
202023-02-18    17
212023-02-22    18
222023-02-26    19
23Freq: 4D, dtype: int32
24
25>>> grouped = ts.groupby(MonthEnd().rollforward)
26
27>>> for name,value in grouped:
28...     print(name)
29...     print(value)
30
312022-12-31 00:00:00
322022-12-12    0
332022-12-16    1
342022-12-20    2
352022-12-24    3
362022-12-28    4
37Freq: 4D, dtype: int32
382023-01-31 00:00:00
392023-01-01     5
402023-01-05     6
412023-01-09     7
422023-01-13     8
432023-01-17     9
442023-01-21    10
452023-01-25    11
462023-01-29    12
47Freq: 4D, dtype: int32
482023-02-28 00:00:00
492023-02-02    13
502023-02-06    14
512023-02-10    15
522023-02-14    16
532023-02-18    17
542023-02-22    18
552023-02-26    19
56Freq: 4D, dtype: int32
57
58>>> grouped.mean()
592022-12-31     2.0
602023-01-31     8.5
612023-02-28    16.0
62dtype: float64

更简单快捷的方法是使用后续会介绍的resample 方法(重采样):

1>>> ts.resample("M").mean()
22022-12-31     2.0
32023-01-31     8.5
42023-02-28    16.0
5FreqMdtypefloat64


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments