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


Posted in Python onDecember 26, 2019

如下所示:

import pandas as pd
import numpy as np

一、介绍

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

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

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

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

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

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.156092
2000-02-29  0.060607
2000-03-31  -0.039608
2000-04-30  -0.154838
Freq: M, dtype: float64
ts.resample('M',kind='period').mean()
2000-01  -0.156092
2000-02  0.060607
2000-03  -0.039608
2000-04  -0.154838
Freq: 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   0
2000-01-01 00:01:00   1
2000-01-01 00:02:00   2
2000-01-01 00:03:00   3
2000-01-01 00:04:00   4
2000-01-01 00:05:00   5
2000-01-01 00:06:00   6
2000-01-01 00:07:00   7
2000-01-01 00:08:00   8
2000-01-01 00:09:00   9
2000-01-01 00:10:00  10
2000-01-01 00:11:00  11
Freq: T, dtype: int32
ts.resample('5min').sum()
2000-01-01 00:00:00  10
2000-01-01 00:05:00  35
2000-01-01 00:10:00  21
Freq: 5T, dtype: int32

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

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

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

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

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

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

四、OHLC重采样

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

print(ts.resample('5min').ohlc())
open high low close
2000-01-01 00:00:00   0   4  0   4
2000-01-01 00:05:00   5   9  5   9
2000-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  15
2  45
3  75
4  95
dtype: int32
ts.groupby(lambda x:x.weekday).mean() # 按周聚合
0  47.5
1  48.5
2  49.5
3  50.5
4  51.5
5  49.0
6  50.0
dtype: 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   Ohio
2000-01-05 -0.078765 1.389417 0.732726 0.816723
2000-01-12 -0.663686 0.744384 1.395332 -0.031715

1.升采样、前向填充

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

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

print(frame)
Colorado   Texas New York   Ohio
2000-01-05 -0.078765 1.389417 0.732726 0.816723
2000-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   Ohio
2000-01-06 -0.078765 1.389417 0.732726 0.816723
2000-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   Ohio
2000-01 -1.956495 -0.689508 0.057439 -0.655832
2000-02 -0.491443 -1.731887 1.336801 0.659877
2000-03 -0.139601 -1.310386 -0.299205 1.194269
2000-04 0.431474 -1.312518 1.880223 0.379421
2000-05 -0.674796 0.471018 0.132998 0.509761
annual_frame = frame.resample('A-DEC').mean()
print(annual_frame)
Colorado   Texas New York   Ohio
2000 -0.332076 -0.762599 0.046917 0.224908
2001 -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   Ohio
2000Q1 -0.332076 -0.762599 0.046917 0.224908
2000Q2 -0.332076 -0.762599 0.046917 0.224908
2000Q3 -0.332076 -0.762599 0.046917 0.224908
2000Q4 -0.332076 -0.762599 0.046917 0.224908
2001Q1 -0.152922 0.168667 -0.326439 -0.052034
2001Q2 -0.152922 0.168667 -0.326439 -0.052034
2001Q3 -0.152922 0.168667 -0.326439 -0.052034
2001Q4 -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   Ohio
2000Q4 -0.332076 -0.762599 0.046917 0.224908
2001Q1 -0.332076 -0.762599 0.046917 0.224908
2001Q2 -0.332076 -0.762599 0.046917 0.224908
2001Q3 -0.332076 -0.762599 0.046917 0.224908
2001Q4 -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   Ohio
2001Q3 -0.332076 -0.762599 0.046917 0.224908
2001Q4 -0.332076 -0.762599 0.046917 0.224908
2002Q1 -0.332076 -0.762599 0.046917 0.224908
2002Q2 -0.332076 -0.762599 0.046917 0.224908
2002Q3 -0.152922 0.168667 -0.326439 -0.052034

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

Python 相关文章推荐
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
python正则表达式之作业计算器
Mar 18 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python计算日期之间的放假日期
Jun 05 Python
python实现俄罗斯方块游戏
Mar 25 Python
Django学习笔记之为Model添加Action
Apr 30 Python
Django实现网页分页功能
Oct 31 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 #Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 #Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 #Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 #Python
python DataFrame转dict字典过程详解
Dec 26 #Python
Numpy之reshape()使用详解
Dec 26 #Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 #Python
You might like
玩转图像函数库―常见图形操作
2006/09/03 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
Ruffy javascript 学习笔记
2009/11/30 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
python绘制简单彩虹图
2018/11/19 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
softmax及python实现过程解析
2019/09/30 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
旅游管理本科生求职信
2013/10/14 职场文书
大型车展策划方案
2014/02/01 职场文书
外联部演讲稿
2014/05/24 职场文书
校庆口号
2014/06/20 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
计划生育诚信协议书
2014/11/02 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
修辞手法有哪些?
2019/08/29 职场文书