Pandas —— resample()重采样和asfreq()频度转换方式


Posted in Python onFebruary 26, 2020

resample()

resample()进行重采样。

重采样(Resampling)指的是把时间序列的频度变为另一个频度的过程。把高频度的数据变为低频度叫做降采样(downsampling),把低频度变为高频度叫做增采样(upsampling)。

降采样

考虑因素:

各区间哪边是闭合的(参数:closed)

如何标记各聚合面元,用区间的开头还是末尾(参数:label)

In [232]: ts_index = pd.date_range('2018-08-03',periods =12,freq = 'T')

In [233]: ts = pd.Series(np.arange(12),index = ts_index)

In [234]: ts
Out[234]:
2018-08-03 00:00:00  0
2018-08-03 00:01:00  1
2018-08-03 00:02:00  2
2018-08-03 00:03:00  3
2018-08-03 00:04:00  4
2018-08-03 00:05:00  5
2018-08-03 00:06:00  6
2018-08-03 00:07:00  7
2018-08-03 00:08:00  8
2018-08-03 00:09:00  9
2018-08-03 00:10:00 10
2018-08-03 00:11:00 11
Freq: T, dtype: int32

默认使用左标签(label=‘left'),左闭合(closed='left')

此时第一个区间为:2018-08-03 00:00:00~2018-08-03 00:04:59,故sum为10,label为:2018-08-03 00:00:00

In [235]: ts.resample('5min').sum()
Out[235]:
2018-08-03 00:00:00 10
2018-08-03 00:05:00 35
2018-08-03 00:10:00 21
Freq: 5T, dtype: int32

可以指定为右闭合(closed='right'),默认使用左标签(label=‘left')

此时第一个区间为:2018-08-02 23:55:01~2018-08-03 00:00:00,故sum为0,label为:2018-08-02 23:55:00

In [236]: ts.resample('5min',closed='right').sum()
Out[236]:
2018-08-02 23:55:00  0
2018-08-03 00:00:00 15
2018-08-03 00:05:00 40
2018-08-03 00:10:00 11
Freq: 5T, dtype: int32

可以指定为右闭合(closed='right'),右标签(label=‘right')

此时第一个区间为:2018-08-02 23:55:01~2018-08-03 00:00:00,故sum为0,label为:2018-08-03 00:00:00

In [237]: ts.resample('5min',closed='right',label='right').sum()
Out[237]:
2018-08-03 00:00:00  0
2018-08-03 00:05:00 15
2018-08-03 00:10:00 40
2018-08-03 00:15:00 11
Freq: 5T, dtype: int32

升采样

考虑因素:

没有聚合,但是需要填充

In [244]: frame = pd.DataFrame(np.random.randn(2, 4),
  ...:      index=pd.date_range('1/1/2000', periods=2,
  ...:           freq='W-WED'), # freq='W-WED'表示按周
  ...:      columns=['Colorado', 'Texas', 'New York', 'Ohio'])

In [245]: frame
Out[245]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

当我们对这个数据进行聚合的的时候,每个组只有一个值,以及gap(间隔)之间的缺失值。在不使用任何聚合函数的情况下,

我们使用asfreq方法将其转换为高频度:

In [246]: df_daily = frame.resample('D').asfreq()

In [247]: df_daily
Out[247]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06  NaN  NaN  NaN  NaN
2000-01-07  NaN  NaN  NaN  NaN
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.711291 -1.070133 1.469272 0.809806

使用ffill()进行填充

In [248]: frame.resample('D').ffill()
Out[248]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-07 1.201713 0.029819 -1.366082 -1.325252
2000-01-08 1.201713 0.029819 -1.366082 -1.325252
2000-01-09 1.201713 0.029819 -1.366082 -1.325252
2000-01-10 1.201713 0.029819 -1.366082 -1.325252
2000-01-11 1.201713 0.029819 -1.366082 -1.325252
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

In [249]: frame.resample('D').ffill(limit=2)
Out[249]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-07 1.201713 0.029819 -1.366082 -1.325252
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.711291 -1.070133 1.469272 0.809806

新的日期索引没必要跟旧的重叠

In [250]: frame.resample('W-THU').ffill()
Out[250]:
   Colorado  Texas New York  Ohio
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-13 -0.711291 -1.070133 1.469272 0.809806

分组重采样

In [279]: times = pd.date_range('2018-08-3 00:00', freq='1min', periods=10)

In [280]: df2 = pd.DataFrame({'time': times.repeat(3),
  ...:      'key': np.tile(['a', 'b', 'c'], 10),
  ...:      'value': np.arange(30)})

In [281]: df2[:5]
Out[281]:
 key    time value
0 a 2018-08-03 00:00:00  0
1 b 2018-08-03 00:00:00  1
2 c 2018-08-03 00:00:00  2
3 a 2018-08-03 00:01:00  3
4 b 2018-08-03 00:01:00  4

In [282]: df2.groupby(['key',pd.Grouper(key='time',freq='5min')]).sum()
Out[282]:
       value
key time
a 2018-08-03 00:00:00  30
 2018-08-03 00:05:00 105
b 2018-08-03 00:00:00  35
 2018-08-03 00:05:00 110
c 2018-08-03 00:00:00  40
 2018-08-03 00:05:00 115

asfreq()

asfreq()进行频度转换。

>>> index = pd.date_range('1/1/2000', periods=4, freq='T')
>>> series = pd.Series([0.0, None, 2.0, 3.0], index=index)
>>> df = pd.DataFrame({'s':series})
>>> df
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:01:00 NaN
2000-01-01 00:02:00 2.0
2000-01-01 00:03:00 3.0

将频度转换为30s

>>> df.asfreq(freq='30S')
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 NaN
2000-01-01 00:01:30 NaN
2000-01-01 00:02:00 2.0
2000-01-01 00:02:30 NaN
2000-01-01 00:03:00 3.0

将频度转换为2min,不会进行重采样(与resample的不同之处)

>>> df.asfreq(freq='2min')
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:02:00 2.0

使用bfill()进行填充

>>> df.asfreq(freq='30S').bfill()
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 NaN
2000-01-01 00:01:30 2.0
2000-01-01 00:02:00 2.0
2000-01-01 00:02:30 3.0
2000-01-01 00:03:00 3.0

以上这篇Pandas —— resample()重采样和asfreq()频度转换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
进一步理解Python中的函数编程
Apr 13 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
python 简单的多线程链接实现代码
Aug 28 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
python实现简易版计算器
Jun 22 Python
浅述python中深浅拷贝原理
Sep 18 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
pandas分批读取大数据集教程
Jun 06 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
python实现银行实战系统
Feb 26 #Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 #Python
python序列类型种类详解
Feb 26 #Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 #Python
Python中if有多个条件处理方法
Feb 26 #Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 #Python
Python处理PDF与CDF实例
Feb 26 #Python
You might like
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
食品安全处置方案
2014/06/14 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
高三英语教学计划
2015/01/23 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
python实现的web监控系统
2021/04/27 Python
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电