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 相关文章推荐
Python基于动态规划算法计算单词距离
Jul 25 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
简单了解python高阶函数map/reduce
Jun 28 Python
python实现猜拳小游戏
Apr 05 Python
python flask中动态URL规则详解
Nov 22 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
python request 模块详细介绍
Nov 10 Python
pytorch训练神经网络爆内存的解决方案
May 22 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
PHP安全编程之加密功能
2006/10/09 PHP
用缓存实现静态页面的测试
2006/12/06 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
php google或baidu分页代码
2009/11/26 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
新闻内页-JS分页
2006/06/07 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python多项式回归的实现方法
2019/03/11 Python
python mysql断开重连的实现方法
2019/07/26 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Python装饰器结合递归原理解析
2020/07/02 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
应用数学自荐书范文
2013/11/24 职场文书
运动会通讯稿50字
2014/01/30 职场文书
简历里的自我评价范文
2014/02/24 职场文书
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL