Pandas 时间序列:重采样及频率转换方式
在 Pandas 中,时间序列数据的处理是一种非常常见的操作。其中一个常用的工具就是重采样(resampling),其可以将时间序列的频率更改为另一个频率,比如将小时频率的数据转换成天频率的数据。本文将介绍 Pandas 中的重采样方法及其频率转换方式。
什么是重采样
重采样顾名思义就是重新采样,其目的是将原时间序列的数据转换成更加频繁或是不那么频繁的形式。在 Pandas 中,时间序列的重采样可以通过resample()
方法来实现。
resample()
方法的核心参数为rule
参数,即重新采样的规则,可以是时间间隔也可以是某个时间点,具体的时间规则可以使用 Pandas 内置的时间散列字符串(参考文档Offset Aliases)。
使用 resample()
方法可以将时间序列的频率变得更加或者更少的规则,从而得到新的时间序列:
import pandas as pd
import numpy as np
# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=12, freq='T')
ts = pd.Series(np.arange(12), index=rng)
# 将数据重采样为每5分钟的频率
ts_resample = ts.resample('5T').sum()
print(ts)
print('-' * 30)
print(ts_resample)
运行上面的代码,输出结果如下:
2018-01-01 00:00:00 0
2018-01-01 00:01:00 1
2018-01-01 00:02:00 2
2018-01-01 00:03:00 3
2018-01-01 00:04:00 4
2018-01-01 00:05:00 5
2018-01-01 00:06:00 6
2018-01-01 00:07:00 7
2018-01-01 00:08:00 8
2018-01-01 00:09:00 9
2018-01-01 00:10:00 10
2018-01-01 00:11:00 11
Freq: T, dtype: int64
------------------------------
2018-01-01 00:00:00 10
2018-01-01 00:05:00 35
2018-01-01 00:10:00 21
Freq: 5T, dtype: int64
上面的代码通过 resample('5T').sum()
将原时间序列的频率变成了5分钟,结果显示了每五分钟之内的总和。首先原始时间序列的频率是每分钟一次,而通过变换后得到的是每5分钟的总和,同时对应于每5分钟的最后一条数据。
重采样的频率转换方式
在数据分析中,频率转换是一个常见的操作。例如,有一份每年的销售额数据,我们需要将其转换成每季度和每月的季度销售额。而 Pandas 中常用的涉及到时间序列的统计函数是与已知频率的数据(规律数据)相关的,如每日、每月、每季度,甚至是每年生命周期的统计。因此,我们在进行数据统计时,常常需要将数据转换成这些已知的频率。
我们通常使用以下方式中的一种来将数据转换成相对应频率的数据:
- 重采样(resampling): 将数据从原始频率转换到另一种频率。数据会被聚合到新的频率间隔中,例如,从每分钟转换到每5分钟。
- 向前填充和向后填充: 向前填充 (
ffill
) 和向后填充 (bfill
) 是在将高频数据转换为低频数 据时使用的技术。向前填充将已知的值向低频望去的时间段上插入;向后填充将下一个已知值向望去的时间段上插入。例如:从每秒钟到每5分钟。 - 插值(interpolation): 插值是一种从数据中提取信息的过程,它可以计算出在不同时间间隔内获得的数据。插值方式包括线性插值、最近邻插值、高阶插值等。
下面我们举两个例子进行更细致的解释。
重采样实例
我们先构造一份两周的时间序列数据,然后将其重采样为每小时,每天和每月:
import pandas as pd
import numpy as np
# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=14, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
print('-' * 30)
# 重采样为每小时
ts_hourly = ts.resample('H').mean()
print(ts_hourly)
print('-' * 30)
# 重采样为每天
ts_daily = ts.resample('D').mean()
print(ts_daily)
print('-' * 30)
# 重采样为每月
ts_monthly = ts.resample('M').mean()
print(ts_monthly)
输出结果为:
2018-01-01 -0.315093
2018-01-02 0.102139
2018-01-03 0.457386
2018-01-04 0.725825
2018-01-05 1.250042
2018-01-06 -1.473972
2018-01-07 0.447782
2018-01-08 0.193237
2018-01-09 0.473884
2018-01-10 -1.862161
2018-01-11 0.578145
2018-01-12 0.813398
2018-01-13 0.100000
2018-01-14 -0.468288
Freq: D, dtype: float64
------------------------------
2018-01-01 00:00:00 -0.315093
2018-01-01 01:00:00 NaN
2018-01-01 02:00:00 NaN
2018-01-01 03:00:00 NaN
2018-01-01 04:00:00 NaN
...
2018-01-13 19:00:00 NaN
2018-01-13 20:00:00 NaN
2018-01-13 21:00:00 NaN
2018-01-13 22:00:00 NaN
2018-01-13 23:00:00 NaN
Freq: H, Length: 336, dtype: float64
------------------------------
2018-01-01 -0.011925
2018-01-02 0.860529
2018-01-03 -0.020814
2018-01-04 0.598670
2018-01-05 0.138494
2018-01-06 -0.482595
2018-01-07 0.951332
2018-01-08 0.425560
2018-01-09 -0.282365
2018-01-10 -1.138321
2018-01-11 -0.041740
2018-01-12 1.068705
2018-01-13 -0.184144
2018-01-14 -0.468288
Freq: D, dtype: float64
------------------------------
2018-01-31 0.142121
Freq: M, dtype: float64
上面的代码通过 resample 方法将原始的时间序列按照不同的频率重新采样,其中:
ts_hourly = ts.resample('H').mean()
将时间序列的频率重采样为每小时,并且聚合方式为求均值。ts_daily = ts.resample('D').mean()
将时间序列的频率重采样为每天,并且聚合方式为求均值。ts_monthly = ts.resample('M').mean()
将时间序列的频率重采样为每月,并且聚合方式为求均值。
向前填充和向后填充实例
下面我们通过一个例子演示向前填充和向后填充。假设有一份每秒钟的数据,我们要将其转换为每5秒钟的数据,并使用向前填充的方式补充缺失的数据。
import pandas as pd
import numpy as np
# 构造时间序列数据
rng = pd.date_range('1/1/2018', periods=6, freq='S')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
print('-' * 30)
# 重采样为每5秒钟,向前填充
ts_resample = ts.resample('5S').ffill()
print(ts_resample)
输出结果为:
2018-01-01 00:00:00 1.232623
2018-01-01 00:00:01 -1.330196
2018-01-01 00:00:02 -0.114359
2018-01-01 00:00:03 1.144459
2018-01-01 00:00:04 -0.011030
2018-01-01 00:00:05 1.158529
Freq: S, dtype: float64
------------------------------
2018-01-01 00:00:00 1.232623
2018-01-01 00:00:05 1.158529
Freq: 5S, dtype: float64
上面的代码通过resample('5S').ffill()
将原始的时间序列重采样为每5秒钟,并使用向前填充的方式补充缺失的数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pandas时间序列:重采样及频率转换方式 - Python技术站