侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Pandas时间序列:重采样及频率转换方式

技术  /  管理员 发布于 7年前   218

如下所示:

import pandas as pdimport numpy as np

一、介绍

重采样(resampling)指的是将时间序列从一个频率转换到另一个频率的处理过程;

将高频率(间隔短)数据聚合到低频率(间隔长)称为降采样(downsampling);

将低频率数据转换到高频率则称为升采样(unsampling);

有些采样即不是降采样也不是升采样,例如将W-WED(每周三)转换为W-FRI;

二、resample方法C转换频率的主力函数

rng = pd.date_range('1/1/2000',periods=100,freq='D')ts = pd.Series(np.random.randn(len(rng)),index=rng)ts.resample('M').mean() # 将100天按月进行降采样(聚合)
2000-01-31  -0.1560922000-02-29  0.0606072000-03-31  -0.0396082000-04-30  -0.154838Freq: M, dtype: float64
ts.resample('M',kind='period').mean()
2000-01  -0.1560922000-02  0.0606072000-03  -0.0396082000-04  -0.154838Freq: M, dtype: float64

三、降采样(聚合)

1.降采样面元(区间)默认才有左闭右开的形式,而且聚合的索引是以左边界标记

rng = pd.date_range('1/1/2000',periods=12,freq='T')ts = pd.Series(np.arange(12),index=rng)ts
2000-01-01 00:00:00   02000-01-01 00:01:00   12000-01-01 00:02:00   22000-01-01 00:03:00   32000-01-01 00:04:00   42000-01-01 00:05:00   52000-01-01 00:06:00   62000-01-01 00:07:00   72000-01-01 00:08:00   82000-01-01 00:09:00   92000-01-01 00:10:00  102000-01-01 00:11:00  11Freq: T, dtype: int32
ts.resample('5min').sum()
2000-01-01 00:00:00  102000-01-01 00:05:00  352000-01-01 00:10:00  21Freq: 5T, dtype: int32

2.通过参数closed='right'可以实现左开右闭

ts.resample('5min',closed='right').sum()
1999-12-31 23:55:00   02000-01-01 00:00:00  152000-01-01 00:05:00  402000-01-01 00:10:00  11Freq: 5T, dtype: int32

3.通过参数label='right'可以实现以右边界为聚合后的标签

ts.resample('5min',closed='right',label='right').sum()
2000-01-01 00:00:00   02000-01-01 00:05:00  152000-01-01 00:10:00  402000-01-01 00:15:00  11Freq: 5T, dtype: int32

4.通过参数loffset可以实现精准的调整标签

ts.resample('5min',closed='right',loffset='-1s').sum()
1999-12-31 23:54:59   01999-12-31 23:59:59  152000-01-01 00:04:59  402000-01-01 00:09:59  11Freq: 5T, dtype: int32

四、OHLC重采样

在金融领域常用的聚合方式COHLC,它会计算各个面元的:第一个值(开盘)、最后一个值(收盘)、最大值和最小值,并产生一个DataFrame

print(ts.resample('5min').ohlc())
           open high low close2000-01-01 00:00:00   0   4  0   42000-01-01 00:05:00   5   9  5   92000-01-01 00:10:00  10  11  10   11

五、通过groupby进行重采样

rng = pd.date_range('1/1/2000',periods=100,freq='D')ts = pd.Series(np.arange(100),index=rng)ts.groupby(lambda x:x.month).mean() # 等价于 ts.groupby(rng.month).mean()
1  152  453  754  95dtype: int32
ts.groupby(lambda x:x.weekday).mean() # 按周聚合
0  47.51  48.52  49.53  50.54  51.55  49.06  50.0dtype: float64

六、升采样和插值

升采样是从低频率到高频率,这样会引入缺失值;

升采样时需要决定采样后结果中具体那个值代替原始的值;

当决定了替换原始值的值后,中间的值会按照频率进行添加;

frame = pd.DataFrame(np.random.randn(2,4),          index = pd.date_range('1/1/2000',periods=2,freq='W-WED'),          columns = ['Colorado','Texas','New York','Ohio'])print(frame)
      Colorado   Texas New York   Ohio2000-01-05 -0.078765 1.389417 0.732726 0.8167232000-01-12 -0.663686 0.744384 1.395332 -0.031715

1.升采样、前向填充

df_daily = frame.resample('D')print(df_daily.ffill())
      Colorado   Texas New York   Ohio2000-01-05 -0.078765 1.389417 0.732726 0.8167232000-01-06 -0.078765 1.389417 0.732726 0.8167232000-01-07 -0.078765 1.389417 0.732726 0.8167232000-01-08 -0.078765 1.389417 0.732726 0.8167232000-01-09 -0.078765 1.389417 0.732726 0.8167232000-01-10 -0.078765 1.389417 0.732726 0.8167232000-01-11 -0.078765 1.389417 0.732726 0.8167232000-01-12 -0.663686 0.744384 1.395332 -0.031715
print(df_daily.ffill(limit=2))
      Colorado   Texas New York   Ohio2000-01-05 -0.078765 1.389417 0.732726 0.8167232000-01-06 -0.078765 1.389417 0.732726 0.8167232000-01-07 -0.078765 1.389417 0.732726 0.8167232000-01-08    NaN    NaN    NaN    NaN2000-01-09    NaN    NaN    NaN    NaN2000-01-10    NaN    NaN    NaN    NaN2000-01-11    NaN    NaN    NaN    NaN2000-01-12 -0.663686 0.744384 1.395332 -0.031715

2.重采样后的日期不一定与先前的日期有交集

print(frame)
      Colorado   Texas New York   Ohio2000-01-05 -0.078765 1.389417 0.732726 0.8167232000-01-12 -0.663686 0.744384 1.395332 -0.031715
print(frame.resample('W-THU').ffill()) # 重采样后的结果开始为全NaN,使用ffill会使用2000-01-05和2000-01-12的值向前填充
      Colorado   Texas New York   Ohio2000-01-06 -0.078765 1.389417 0.732726 0.8167232000-01-13 -0.663686 0.744384 1.395332 -0.031715

七、通过时期(period)进行重采样

1.将采样

frame = pd.DataFrame(np.random.randn(24,4),          index = pd.period_range('1-2000','12-2001',freq='M'),          columns = ['Colorado','Texas','New York','Ohio'])print(frame[:5])
     Colorado   Texas New York   Ohio2000-01 -1.956495 -0.689508 0.057439 -0.6558322000-02 -0.491443 -1.731887 1.336801 0.6598772000-03 -0.139601 -1.310386 -0.299205 1.1942692000-04 0.431474 -1.312518 1.880223 0.3794212000-05 -0.674796 0.471018 0.132998 0.509761
annual_frame = frame.resample('A-DEC').mean()print(annual_frame)
   Colorado   Texas New York   Ohio2000 -0.332076 -0.762599 0.046917 0.2249082001 -0.152922 0.168667 -0.326439 -0.052034

2.通过convention决定在升采样后,那端来替换原来的值

# Q-DEC:以12月做为最后一个季度的最后一个月进行升采样.也就是1-3月是1季度,4-6月是2季度,7-9月是3季度,10-12月是4季度print(annual_frame.resample('Q-DEC').ffill())
    Colorado   Texas New York   Ohio2000Q1 -0.332076 -0.762599 0.046917 0.2249082000Q2 -0.332076 -0.762599 0.046917 0.2249082000Q3 -0.332076 -0.762599 0.046917 0.2249082000Q4 -0.332076 -0.762599 0.046917 0.2249082001Q1 -0.152922 0.168667 -0.326439 -0.0520342001Q2 -0.152922 0.168667 -0.326439 -0.0520342001Q3 -0.152922 0.168667 -0.326439 -0.0520342001Q4 -0.152922 0.168667 -0.326439 -0.052034
# 使用2000Q4替换2000、2001Q4替换2001,这两个值2000Q4和2001Q4之间就是升采样新增的值print(annual_frame.resample('Q-DEC',convention='end').ffill())
    Colorado   Texas New York   Ohio2000Q4 -0.332076 -0.762599 0.046917 0.2249082001Q1 -0.332076 -0.762599 0.046917 0.2249082001Q2 -0.332076 -0.762599 0.046917 0.2249082001Q3 -0.332076 -0.762599 0.046917 0.2249082001Q4 -0.152922 0.168667 -0.326439 -0.052034

3.综合案例解析

Q-MAR:4-6月是1季度,7-9月是2季度,10-12月是3季度,1-3月是4季度;

2000-01到2000-03是2000Q4,2000-04到2000-6是2001Q1,以此类推;

2000转变为[2000Q4,2001Q1,2001Q2,2001Q3],2001转变为[2001Q4,2002Q1,2002Q2,2002Q3];

convention='end',那么会使用2001Q3替换原始的2000,2002Q3替换2001,中间的部分自动添加;

索引结果为[2001Q3,2001Q4,2002Q1,2002Q2,2002Q3];

print(annual_frame.resample('Q-MAR',convention='end').ffill())
    Colorado   Texas New York   Ohio2001Q3 -0.332076 -0.762599 0.046917 0.2249082001Q4 -0.332076 -0.762599 0.046917 0.2249082002Q1 -0.332076 -0.762599 0.046917 0.2249082002Q2 -0.332076 -0.762599 0.046917 0.2249082002Q3 -0.152922 0.168667 -0.326439 -0.052034

以上这篇Pandas时间序列:重采样及频率转换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    torch 中各种图像格式转换的实现方法
    下一条:
    pandas实现DataFrame显示最大行列,不省略显示实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客