【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语言中文网

相关推荐
程序员爱钓鱼24 分钟前
Python编程实战 · 基础入门篇 | 什么是Python
后端·python
程序猿小D25 分钟前
【完整源码+数据集+部署教程】遥感图像道路检测分割系统源码和数据集:改进yolo11-CARAFE
python·yolo·计算机视觉·目标跟踪·数据集·yolo11·遥感图像道路检测分割系统
zy_destiny32 分钟前
【工业场景】用YOLOv8实现人员打电话识别
人工智能·python·深度学习·yolo·机器学习·计算机视觉·目标跟踪
FreeBuf_32 分钟前
Happy DOM曝CVSS 9.4严重RCE漏洞,PoC已公开(CVE-2025-61927)
java·c语言·c++·python·php
C嘎嘎嵌入式开发44 分钟前
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
数据结构·python·算法
程序员杰哥1 小时前
Pytest与Unittest测试框架对比
自动化测试·软件测试·python·测试工具·测试用例·excel·pytest
wxin_VXbishe1 小时前
基于SpringBoot的天天商城管理系统的设计与现-计算机毕业设计源码79506
java·c++·spring boot·python·spring·django·php
睿思达DBA_WGX1 小时前
使用 python-docx 库操作 word 文档(3):读取word文档的内容
python·word
这里有鱼汤1 小时前
别再凭感觉画股票箱体了!用DBSCAN让你的策略更稳、更准、更客观
后端·python
AALoveTouch1 小时前
同程旅行签到脚本
python