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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的resample函数是用于对时间序列数据进行重采样的函数。它可以将时间序列数据从一个时间频率转换为另一个时间频率。例如,将每天的数据转换为每周的数据或每月的数据。resample函数可以对数据进行聚合操作,例如求和、平均值、最大值、最小值等。 resample函数的语法如下: ```python DataFrame.resample(rule, axis=, closed=None, label=None, convention='start', kind=None, loffset=None, base=None, on=None, level=None) ``` 其中,参数rule是重采样的规则,可以是字符串、日期偏移量或时间段。axis参数指定要重采样的轴,默认为,即行轴。closed参数指定重采样区间的闭合方式,label参数指定重采样区间的标签方式。convention参数指定重采样区间的起始点或结束点。kind参数指定重采样的方法,例如求和、平均值等。loffset参数指定重采样后的时间偏移量。base参数指定重采样的基准时间。on参数指定要重采样的列名。level参数指定要重采样的层级。 使用resample函数可以方便地对时间序列数据进行重采样和聚合操作,从而得到更高层次的数据分析结果。 ### 回答2: Python中的resample(重采样)函数,是一个用于对时间序列数据进行重新采样的函数。对于时段不同的两个时间序列,如果想要进行比较或合并,就需要对它们进行重采样,统一时段间隔,这样能够更加精准的比较和合并两个时序数据。 resample函数的基本语法为: `DataFrame.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)` 各个参数含义如下: - rule: 重采样规则字符串或DateOffset对象,规定要重采样的时间间隔。 - how: 降采样时,指定重采样后各时间段内的数值如何计算。通常使用的有sum, mean, std等。 - axis: 轴向,默认为0,即按列进行重采样。 - fill_method: 升采样时,如何用数据填充新增时间戳,例如ffill, bfill等。 - closed: 升采样时,指定新增时间戳的位置关系,例如left, right等。 - label: 升采样时,用于指定新样本的标签位置,以样本的开始或结束为标记。 - convention: start,end,middle是将重采样后的标签设定为每段的开始、结束还是中间。(默认为 start)。 - kind: 重采样方法。一般情况下‘时’或‘周期’。 - loffset: 对重采样后的时间轴标签进行位移 - limit: 限制重采样的结果数量 - on: 对数据集中的某一列进行重采样 - level: 对分层索引的指定层级进行重采样 重采样的方式有两种,一种是升采样,即将低频率的时间序列增加到高频率,如天重采样到小时级别;另一种是降采样,即将高频率的时间序列降低到低频率,如将秒重采样到分钟级别或者小时级别均属于降采样。 总体而言,resample函数Python数据处理当中相当实用,能够迅速处理并分析各类时间序列数据,对于需要对时间类数据进行分析或处理的场合,resample函数将成为你必不可少的工具。 ### 回答3: Python中的resample函数是一种非常常用的信号处理函数,它主要用于信号处理中的重采样操作。所谓重采样,就是在保持原始信号数据的条件下,改变采样率,即对信号进行插值或降采样操作。 resample函数的调用方式如下: ```python scipy.signal.resample(x, num, t=None, axis=0, window=None) ``` 其中,参数解释如下: - x:要重采样的信号; - num:新的结果数组中样本点的数量; - t:可选参数,可以视为重采样之间的时间间隔。默认值为1。如果 t 等于1,则表示信号没有重采样,并且 num 需要大于或等于原始数据中样本点的数量。如果 t 不等于1,则表示重采样,在这种情况下,num 的值可以小于、等于或大于原始数据中样本点的数量。 - axis:可选参数,指定进行重采样的轴,默认值为0。如果给定多个轴,则在每个指定轴上对信号进行重采样;如果给定轴是 None,则沿着数组的第一个轴进行重采样。 - window:可选参数,指定要使用的窗口函数(例如汉明窗)。 resample函数的返回值是一个 NumPy 数组,其形状与原始信号数据的形状相同,但其样本点数量发生了改变。 如果需要对信号进行插值,只需将 num 设置为源数据样本点数量的倍数即可。例如,如果源数据中最初有 100 个样本点,并且希望将信号插值为 300 个样本点,则将 num 设置为 300。 如果希望将信号进行降采样,则需要将 num 设置为小于源数据样本点数量的值。如果要按照 2:1 的比例对信号进行降采样,那么将 num 设置为源数据样本点数量的一半就可以了。 总之,使用 Python 的 resample 函数可以非常方便地进行信号处理中的重采样操作,如插值或降采样。通过合理使用参数,可以实现不同的数据采样要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值