Pandas —— resample()重采样和asfreq()频度转换方式
作者:starter_zheng 发布时间:2023-12-10 16:51:09
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
来源:https://blog.csdn.net/starter_____/article/details/81437626


猜你喜欢
- 查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶
- 本文实例讲述了Zend Framework动作助手Redirector用法。分享给大家供大家参考,具体如下:Redirector 提供另一种
- 在框架选择上,不少人会觉得swoft才是最强PHP框架,尤其是在常驻内存模式的应用级高性能框架,性能是这一堆页面级框架遥不可及的,但是使用上
- 引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心
- mysql复制表中的一列到另一个表中有时候,我们需要复制某个字段一整列的数据到另外一个新的字段中,这很简单,SQL可以这么写:UPDATE
- 在 MySQL 主从复制时,有时候会碰到这样的故障:在 Slave 上 Slave_IO_Running 和 Slave_SQL_Runni
- 函数嵌套,这个名字有点纠结,也许不太好理解。一个比较常见的函数嵌套特例:递归函数,即函数自己嵌套自己。 一直以为在PHP中不能有太多的函数嵌
- django model的json字段的编码器不能有效编码诸如uuid,datetime等数据类型,当直接存储此类型的对象到json字段中为
- 数据可视化是以图形格式呈现数据。它通过以简单易懂的格式汇总和呈现大量数据,帮助人们理解数据的重要性,并有助于清晰有效地传达信息。考虑这个给定
- 本文实例为大家分享了python3.6使用SMTP协议发送邮件的具体代码,供大家参考,具体内容如下代码如下:# !/usr/bin/pyth
- 前言在使用MySQL数据库的时候,有时候需要客户机直接远程登陆服务器的数据库 ,而不是将请求发给数据库服务器。这时候就需要配置下MySQL的
- 比如下面一个listbinfo = ['lao','wang','python']我们通过h
- 这是我使用python写的第一个类(也算是学习面向对象语言以来正式写的第一个解耦的类),记录下改进的过程。分析需求最初,因为使用time模块
- 阅读:Mootools常用方法扩展(三) 继续Mootools常用方法扩展,这次是Window类上的扩展,也就是全局函数。方法:$param
- 在django中,ORM(对象关系映射器—object-relational mapper)任务是:模型化数据库,创建数
- 本文是mysql 数据库问题一 将表一的数据导入表二:将表一的数据导入表二:将表二中的数据 插入到 表一,表一的列对应表二 select 出
- 本文实例讲述了python遍历类中所有成员的方法。分享给大家供大家参考。具体分析如下:这段代码自定义了一个类,类包含了两个成员title和u
- 前言使用pandas进行数据分析的时候,我们经常需要对DataFrame的行或者列进行索引。使用pandas进行索引的方法主要有三种:直接使
- 执行 datax 作业,创建执行文件,在 crontab 中每天1点(下面有关系)执行:其中 job_start 及 job_finish
- 本文实例讲述了php字符串截取函数mb_substr用法。分享给大家供大家参考,具体如下:string mb_substr ( string