python resample函数_python时序分析之重采集(resample)

接着上一回说到的时序分析,上一回主要是学习了datetime库和pandas.to_datetime模块。

今天我们要学习的是resample,这一讲的内容很多,也有很多有意思的东西。

老规矩,用到的资料来源于pandas.DataFrame.resample - pandas 0.24.2 documentation​pandas.pydata.org

参考书Wes McKinney著的Python for Data Analysis,中文名叫《利用python进行数据分析》

在开始resample之前,我觉得有必要介绍一个模块data_range,在介绍data_range之前,我想补充一下datetime的格式说明哇,这个被压缩的好厉害

这个格式也是format最常用的。当然需要牢记。

好的,我们开始data_range的学习

老规矩,先看一下data_range的参数使用

pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False,

name=None, closed=None, **kwargs)date_range常用的几个参数

这里我就主要介绍一下常用的参数

1:start 这个参数是时间索引的起始时间

2:end 自然这个参数是结束的时间

3:period ,如果你只使用了起始或结束的时间戳,那么就需要使用period来告知一个范围

4:freq 这个是frequency的缩写,也就是频率,这个是一个非常重要的参数,可以通过设置这个参数得到自定义的时间频率

官方文档为这些频率做了一个说明,我就直接复制下来了官方文档给出的解释,这里是常用的基础单词,我就不翻译了

还有两张图片我相信各位看官都能看懂,我就不班门弄斧了多不多,我觉得我已经go die了

光看上面的图片,我觉得很容易就晕掉了,我们来看一看具体的例子,我敬重的考研名师宇哥说过“数无形时少直觉”那么我们用实际的例子去解决上面的问题。

因为昨天学了datetime模块,所以我这里就自己结合了datetime

首先先导入需要以及可能用到的库

import pandas as pd

import numpy as np

from datetime import datetime

下一步使用不同的采集方式

pd.date_range(start=datetime.now(), periods=5, freq='B')输出结果

让我们分析分析这个语句,首先start=datetime.now(),这个语句的意思是获取当前的时间,

而period=5的意思是获得5个时间点,如果没有后面的freq,则默认的是获得天数。我们可以在执行一条语句

pd.date_range(start=datetime.now(), periods=5)注意看这里的freq='D'这是模块默认的

那么这两个语句的区别在于freq,第一个设置freq='B' 根据上面表格里面的内容,B = Business day 也就是工作日,可以看到第一个的输出结果就是显示的就是从明天开始的5个工作日。

再来看一个例子

pd.date_range(start='20130809',periods=8,freq='SM')这里我使用了freq='SM'

SM=semi-month end frequency(15th and end of month)也即是取每月的15号和当月的最后一天,比如29,28,30,31

当然还可以举很多的例子,但是后面就是重复的过程了,所以我就不继续下去了,我下面将会做两个时间频率叠加的操作

请看

pd.date_range(start=datetime.now(),periods=5,freq='2h20min')请注意这里的freq

这里的freq我使用的2h20min,也就是2小时20分钟,也即140分钟,所以输出结果里面写明了freq=140T,其中T就是minutes频率的表示,我们同样可以直接在此处使用freq=140T

pd.date_range(start=datetime.now(),periods=5,freq='140T')可以看到效果是一样的

我们在看一个例子

pd.date_range(start='20190623', periods=10, freq='1D10U')可以看到这里的输出结果是多了1天10微秒

这一点在实际中用到的情况还算是比较多的。

总结一下,其实这一部分非常的常用,所以还是需要熟知的,至于其他的时间,实际工作或者学习的时候遇到了,可以直接去查找官方的文档,Time Series / Date functionality​pandas.pydata.org

可以直接查阅上面的这个链接然后查询

下面我们将会对重新采样和频率转换(resample)做一个基本的了解

同样的老规矩先上链接pandas.Series.resample - pandas 0.24.2 documentation​pandas.pydata.org

resample这个模块有两类--1:pandas.Series.resample, 2:pandas.DataFrame.resample

常规操作先看一下resample这个模块的参数

Series.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',

kind=None, loffset=None, limit=None, base=0, on=None, level=None)

在介绍参数之前,我想先说明一下什么是重新采样:重新采样是值将时间序列从一个频率转换为另一个频率的过程,将更高频率的数据聚合到低频率被称为向下采样,而从低频率转换为高频率被称为向上采样,但是好有一种是同频之间的切换,比如W-WED(weekly on Wednesday 每周三)转换到W-FRI(每周五)

好的讲清楚了,下面看一下参数参数如图

话说知乎压缩图片也太夸张了吧。。。。

好吧,凑合着看吧,下面我们把上面几个参数按照导图的形式表示出来

下面我将围绕上面的几个参数举几个例子

先生成几个时间

index = pd.date_range('1/1/2000',periods=9,freq='T')

series = pd.Series(range(9),index=index)

series执行结果

这个时间是按照1分钟为频率生成的,下面我要向下采集以3分钟为频率,并把时间戳的合计值放在一个bin(可以翻译为箱子)里面

series.resample('3T').sum()执行结果

下面的几个例子都是处理closed和label这几个参数的,为了更好地对比,我先把上面这个例子的参数的默认值表示出来

series.resample('3T')执行结果

各位看官可以注意这里面的默认值,closed和label都是left,那么我改变一下closed和label的值会发生什么呢?

series.resample('3T',label='right').sum()执行结果

可以发现和第一个相比较第二个的第一个重采集执行数据是03而不是00,所以这个就是两者的区别

我们在看一下,加入closed的情况

series.resample('3T',label='right',closed='right').sum()执行结果

可能上面几个例子不是很直观,那么这里可以引入loffset,来讲索引移动一定的数量,如从右边缘减去一秒,

series.resample('3T',label='right',

closed='right',loffset='-1s').sum()执行结果

series.resample('3T',loffset='-1s').sum()执行结果

series.resample('3T',label='right',loffset='-1s').sum()执行结果

到这里向下采集也有很多朋友称为降频率就结束了,下一步就是升频率

向上采集的时候可能会出现很多空值,

series.resample('30S').asfreq()[0:5]执行结果

我们可以使用asfreq方法,在不聚合的情况下转换到高频率。

而对于出现的空值,我们可以使用fillna,和reindex的方法填充和插值方法

插值的时候可以使用ffill,bfill,pad等方式

series.resample('30S').pad()[0:5]执行结果

series.resample('30S').ffill()[0:5]执行结果

series.resample('30S').bfill()[0:5]执行结果

可以看到ffill是插入相邻的上一个数据,bfill是插入相邻的下一个数据,而pad好像执行结果和ffill是一样的,我找了很久也没收到这个是什么操作,由于周末时间不早了,这个就先留一个坑,下一次在补上吧。

好的到这里今天的时序就算结束了,虽然还有金融常用的OHLC以及移动窗口函数,但是这个对于我来讲暂时还用不到,等真的用到的时候再回来看吧。

好的,总结一下:今天主要是学了如何生成一个想要的时间频率的数据,以及如何重新采集时间。

希望这篇文章能够给予同为菜鸟的看官以帮助。

好的,我今天就不求赞了,拖得太久了。。。。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值