Press "Enter" to skip to content

使用Pandas的resample()函数处理时间序列重采样数据

Pandas 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)

参数详解:

参数说明
freq表示重采样频率,例如‘M’、‘5min’,Second(15)
how=’mean’用于产生聚合值的函数名或数组函数,例如‘mean’、‘ohlc’、np.max等,默认是‘mean’,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’
axis=0默认是纵轴,横轴设置axis=1
fill_method = None升采样时如何插值,比如‘ffill’、‘bfill’等
closed = ‘right’在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’
label= ‘right’在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
loffset = None面元标签的时间校正值,比如‘-1s’或Second(-1)用于将聚合标签调早1秒
limit=None在向前或向后填充时,允许填充的最大时期数
kind = None聚合到时期(‘period’)或时间戳(‘timestamp’),默认聚合到时间序列的索引类型
convention = None当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end’

以下是rule的取值:

B工作日频率
C自定义工作日频率
D日历日频率
W每周频率
M月末频率
SM半月末频率(15日和月末)
BM营业月末频率
CBM自定义业务月末频率
MS月初频率
SMS半个月开始频率(第1次和第15次)
BMS营业月开始频率
CBMS自定义营业月开始频率
Q四分之一端频率
BQ业务季度末频率
QS四分之一起始频率
BQS业务季度开始频率
A年终频率
BA营业年末频率
AS年份起始频率
BAS业务年度开始频率
BH营业时间频率
H每小时频率
T分钟频率
S第二频率
L毫秒
U微秒
N纳秒

下面拿一个例子来演示一下:演示日K线转周K线

首先打开一份数据

这是平安银行从1991年4月3号到2019年4月4号的日K线数据

假如我想看它的周K线数据呢?这个时候就可以使用 resample()函数来操作了

具体操作如下:

import pandas as pd
import os

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文

df:pd.DataFrame=pd.read_hdf(r'C:\Users\86156\Desktop\yuear\day.h5',key='sz000001',mode='r')
df['交易日期']=pd.to_datetime(df['交易日期']) #转换为日期格式
df.set_index('交易日期',inplace=True)
print(df)

df_week=pd.DataFrame() #创建一个空的DataFrame
df_week['开盘价']=df['开盘价'].resample(rule='1W').first() # first 取这一周的第一行数据
df_week['收盘价']=df['收盘价'].resample(rule='1W').last() # last 取这一周的最后一行数据
df_week['最高价']=df['最高价'].resample(rule='1W').max() # max 取这一周的最高值数据
df_week['最低价']=df['最低价'].resample(rule='1w').min() # min 取这一周的最小值数据
print(df_week)

这样就实现了将日K线的数据转换为周K线的数据

除此之外,resample()函数还有汇总统计功能(统计月成交量、成交额)

例如我想要把成交量和成交额转换为总成交量和总成交额

只需要增加这两行代码即可

df_week['成交量']=df['成交量'].resample(rule='1W').sum() # sum 取这一周的累计和数据
df_week['成交额']=df['成交额'].resample(rule='1W').sum() # sum 取这一周的累计和数据

如果想将日K转换成月K,只需要改变resample函数里面的rule值

rule表示的是你放一个什么样的周期性指标在里面,用M代表Month,Y代表Year,W代表Week

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注