【Python数据分析】Pandas_数据重采样

数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下:

方法 说明
降采样 将高频率(间隔短)数据转换为低频率(间隔长)。
升采样 将低频率数据转换为高频率。

Pandas 提供了 resample() 函数来实现数据的重采样。

降采样

通过 resample() 函数完成数据的降采样,比如按天计数的频率转换为按月计数。

python 复制代码
import pandas as pd
import numpy as np
rng = pd.date_range('1/1/2021',periods=100,freq='D')
ts = pd.Series(np.random.randn(len(rng)),index=rng)
#降采样后并聚合
print(ts.resample('M').mean())

运行结果:

复制代码
2021-01-31   -0.001888
2021-02-28   -0.333447
2021-03-31   -0.221355
2021-04-30   -0.507379
Freq: ME, dtype: float64

如果您只想看到月份,那么您可以设置kind=period如下所示:

python 复制代码
ts.resample('M',kind='period').mean()

升采样

升采样是将低频率(时间间隔)转换为高频率,示例如下:

python 复制代码
import pandas as pd
import numpy as np
#生成一份时间序列数据
rng = pd.date_range('1/1/2021', periods=20, freq='3D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts.head())
print("\n")
#使用asfreq()在原数据基础上实现频率转换
print(ts.resample('D').asfreq().head())

运行结果:

复制代码
2021-01-01   -0.378926
2021-01-04   -1.366412
2021-01-07    1.789886
2021-01-10    1.765642
2021-01-13   -2.071414
Freq: 3D, dtype: float64


2021-01-01   -0.378926
2021-01-02         NaN
2021-01-03         NaN
2021-01-04   -1.366412
2021-01-05         NaN
Freq: D, dtype: float64

频率转换

asfreq() 方法不仅能够实现频率转换,还可以保留原频率对应的数值,同时它也可以单独使用,示例如下:

python 复制代码
import pandas as pd
index = pd.date_range('1/1/2021', periods=6, freq='T')
series = pd.Series([0.0, None, 2.0, 3.0,4.0,5.0], index=index)
df = pd.DataFrame({'s':series})
print(df.asfreq("45s"))

运行结果:

复制代码
                       s
2021-01-01 00:00:00  0.0
2021-01-01 00:00:45  NaN
2021-01-01 00:01:30  NaN
2021-01-01 00:02:15  NaN
2021-01-01 00:03:00  3.0
2021-01-01 00:03:45  NaN
2021-01-01 00:04:30  NaN

插值处理

从上述示例不难看出,升采样的结果会产生缺失值,那么就需要对缺失值进行处理,一般有以下几种处理方式:

方法 说明
pad/ffill 用前一个非缺失值去填充缺失值。
backfill/bfill 用后一个非缺失值去填充缺失值。
interpolater('linear') 线性插值方法。
fillna(value) 指定一个值去替换缺失值。

下面使用插值方法处理 NaN 值,示例如下:

python 复制代码
import pandas as pd
import numpy as np
#创建时间序列数据
rng = pd.date_range('1/1/2021', periods=20, freq='3D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts.resample('D').asfreq().head())
print("\n")
#使用ffill处理缺失值
print(ts.resample('D').asfreq().ffill().head())

运行结果:

复制代码
2021-01-01   -0.136353
2021-01-02         NaN
2021-01-03         NaN
2021-01-04   -0.573291
2021-01-05         NaN
Freq: D, dtype: float64


2021-01-01   -0.136353
2021-01-02   -0.136353
2021-01-03   -0.136353
2021-01-04   -0.573291
2021-01-05   -0.573291
Freq: D, dtype: float64

参考:C语言中文网

相关推荐
笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能7 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂8 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study8 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境9 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境9 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1239 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021610 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0010 小时前
一个项目带你入门AI应用开发01
python
05664610 小时前
Python康复训练——常用标准库
开发语言·python·学习