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的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
python多进程共享变量
Apr 06 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python实现翻转数组功能示例
Jan 12 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
python解包概念及实例
Feb 17 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递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
php通过各种函数判断0和空
2020/07/04 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
对于Python的框架中一些会话程序的管理
2015/04/20 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
python global和nonlocal用法解析
2020/02/03 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
追悼会上的答谢词
2014/01/10 职场文书
少年闰土教学反思
2014/02/22 职场文书
经典促销广告词大全
2014/03/19 职场文书
招标承诺书
2014/08/30 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
发布会邀请函
2015/01/31 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
MySQL基础(一)
2021/04/05 MySQL
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python