Python Pandas – 将给定的时间戳转换为以周为频率的周期
在数据分析领域,时间序列数据处理是必不可少的一环。Pandas作为Python语言中常用的数据处理库,提供了丰富的时间序列处理操作,其中就包括将时间戳转换为以周为频率的周期。
在上述转换过程中,Pandas中的resample()方法可以帮我们实现。本篇文章将围绕这个话题展开,介绍resample()方法的使用并给出实际示例。
更多Pandas相关文章,请阅读:Pandas 教程
Pandas的resample()方法
resample()方法是Pandas中常用的时间序列方法之一,它能够对时间序列进行采样、重采样操作,并支持聚合功能。该方法与groupby()方法类似,是一个分组运算,能够对时间序列进行重新取样,并按一定的时间频率进行聚合。
resample()方法的主要参数如下:
- freq:表示重采样频率。可以是字符串,如“D”代表天,“H”代表小时,“M”代表月,也可以是时间偏移量的别名,如pd.DateOffset(weeks=1),代表每周一次。
- how:表示重采样运算方法。如“mean”代表均值,“sum”代表和,“count”代表非缺失值的数量等。
- closed:表示区间闭合的方式。如“right”代表右端点闭合,“left”代表左端点闭合。
- label:表示采样点标签的位置。如“right”代表标签放在区间的右端点,“left”代表标签放在区间的左端点。
- axis:表示重采样的轴。如“0”代表对行进行重采样操作,“1”代表对列进行重采样操作。
示例一
接下来我们就通过两个示例来具体讲解resample()方法的使用。
假设我们有如下时间序列数据:
import pandas as pd
import numpy as np
dates = pd.date_range('20220101', periods=24, freq='H')
temperature = pd.DataFrame({'temperature': np.random.randint(10, 30, size=len(dates))}, index=dates)
print(temperature)
输出结果如下:
temperature
2022-01-01 00:00:00 22
2022-01-01 01:00:00 23
2022-01-01 02:00:00 28
2022-01-01 03:00:00 20
2022-01-01 04:00:00 27
2022-01-01 05:00:00 26
2022-01-01 06:00:00 24
2022-01-01 07:00:00 29
2022-01-01 08:00:00 14
2022-01-01 09:00:00 20
2022-01-01 10:00:00 22
2022-01-01 11:00:00 28
2022-01-01 12:00:00 12
2022-01-01 13:00:00 15
2022-01-01 14:00:00 20
2022-01-01 15:00:00 26
2022-01-01 16:00:00 10
2022-01-01 17:00:00 25
2022-01-01 18:00:00 27
2022-01-01 19:00:00 17
2022-01-01 20:00:00 24
2022-01-01 21:00:00 23
2022-01-01 22:00:00 22
2022-01-01 23:00:00 28
我们可以使用resample()方法将以小时为单位的temperature转换为以周为单位的数据。执行如下代码:
weekly_temperature = temperature.resample('W').mean()
print(weekly_temperature)
输出结果如下:
temperature
2022-01-02 22.000000
2022-01-09 22.875000
可以看出,在我们使用resample()方法时,将freq参数设为“W”即可将数据转换为以周为单位的时间周期,并使用mean()方法计算每周的平均温度。
示例二
接下来我们再看一个稍微复杂一些的示例,假设我们有如下时间序列数据:
import pandas as pd
import numpy as np
dates = pd.date_range('20220101', periods=100, freq='D')
data = np.random.randint(20, 50, size=len(dates))
sales = pd.DataFrame({'sales': data}, index=dates)
print(sales)
输出结果如下:
sales
2022-01-01 28
2022-01-02 36
2022-01-03 40
2022-01-04 22
2022-01-05 45
... ...
2022-04-06 37
2022-04-07 25
2022-04-08 20
2022-04-09 41
2022-04-10 40
[100 rows x 1 columns]
我们希望将数据转换为以周为周期,并统计每周最大销售额和平均销售额。可以通过如下代码实现:
weekly_sales = sales.resample('W').agg({'sales': ['max', 'mean']})
print(weekly_sales)
输出结果如下:
sales
max mean
2022-01-02 36 31.000000
2022-01-09 45 34.285714
2022-01-16 49 34.714286
2022-01-23 47 35.571429
2022-01-30 49 33.428571
2022-02-06 48 36.714286
2022-02-13 49 34.000000
2022-02-20 44 32.142857
2022-02-27 45 29.285714
2022-03-06 46 36.285714
2022-03-13 49 36.000000
2022-03-20 46 29.857143
2022-03-27 45 35.428571
2022-04-03 48 34.714286
2022-04-10 41 33.000000
从代码中可以看出,我们首先将销售数据resample到以周为周期,然后使用agg函数聚合数据,其中使用字典指定销售数据的最大值和平均值。
结论
通过上述两个示例,我们可以发现,resample()方法在时间序列数据处理中是非常实用的。在使用该方法时,我们可以通过指定freq参数和如mean()、max()、min()这样的方法来实现重采样的聚合方式,并得到我们想要的结果。