本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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》翻译整理
—————————————————–
移位(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
参数指示应用于时间戳的偏移量,但它不会更改数据的基础频率(如果有)。
pandas 日期偏量也可以使用 datetime
或 Timestamp
对象:
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')
锚定的偏置量可以使用 rollforward
和 rollback
方法将日期显式地向前或向后“滚动”:
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
5Freq: M, dtype: float64
本篇文章来源于微信公众号: 码农设计师