Pandas resample()函数是一个简单、强大、高效的函数,用于在频率转换期间执行重采样操作。
resample()函数的语法:
DataFrame.resample(rule, on='索引列名', axis=0, fill_method=None, label='left', closed='left')
on:可以指定某一列使用resample,例如:例如:resample(‘3D’, on=’交易日期’).sum()
axis=0:默认是纵轴,横轴设置axis=1
fill_method = None:升采样时如何插值,比如‘ffill’(向上采样)、‘bfill’(向下采样)等
label= ‘right’:在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
closed = ‘right’:在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’
label=’left’, closed=’left’,建议统一设置成’left’
以下是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 | 纳秒 |
注意:
使用resample函数,首先索引一定为datatime
resample返回的是一个对象,我们可以对这个对象使用聚合函数,例如resample(‘3T’).sum()
下面拿一个例子来演示一下:演示日K线转周K线
首先打开一份日K线数据
股票代码 股票名称 交易日期 开盘价 最高价 最低价 收盘价 前收盘价 成交量 成交额 流通市值 总市值
0 sz000001 深发展A 1991-01-03 66.40 66.40 66.40 66.40 67.41 21200.0 1.410000e+06 2.463440e+09 4.508560e+09
1 sz000001 深发展A 1991-01-04 66.07 66.07 66.07 66.07 66.40 16800.0 1.109000e+06 2.451197e+09 4.486153e+09
2 sz000001 深发展A 1991-01-07 66.42 66.42 66.42 66.42 66.07 40200.0 2.672000e+06 2.464182e+09 4.509918e+09
3 sz000001 深发展A 1991-01-09 65.76 65.76 65.76 65.76 66.42 6100.0 4.010000e+05 2.439696e+09 4.465104e+09
4 sz000001 深发展A 1991-01-10 65.43 65.43 65.43 65.43 65.76 4900.0 3.200000e+05 2.427453e+09 4.442697e+09
... ... ... ... ... ... ... ... ... ... ... ... ...
7373 sz000001 平安银行 2022-02-21 16.66 16.67 16.32 16.51 16.77 80099455.0 1.316024e+09 3.203890e+07 3.203917e+07
7374 sz000001 平安银行 2022-02-22 16.31 16.44 16.16 16.23 16.51 89495673.0 1.454156e+09 3.149554e+07 3.149581e+07
7375 sz000001 平安银行 2022-02-23 16.30 16.31 16.04 16.19 16.23 88674244.0 1.431290e+09 3.141792e+07 3.141818e+07
7376 sz000001 平安银行 2022-02-24 16.13 16.15 15.80 15.91 16.19 132408685.0 2.112843e+09 3.087456e+07 3.087482e+07
7377 sz000001 平安银行 2022-02-25 15.99 16.08 15.87 15.90 15.91 72639707.0 1.157890e+09 3.085515e+07 3.085541e+07
假如我想把这些日线数据转换成周线数据,这个时候就可以使用 resample()函数来操作了
具体操作如下:
df = pd.read_csv(r'C:/Users/86156/Desktop/H5/sz000001.csv', encoding='gbk', skiprows=1)
df['交易日期']=pd.to_datetime(df['交易日期'])
df_week=df.resample('1W', on='交易日期').agg({
'股票代码':'last',
'股票名称':'last',
'开盘价':'first',
'最高价':'max',
'最低价':'min',
'收盘价':'last',
'前收盘价': 'last',
'成交量': 'sum',
'成交额': 'sum',
'流通市值': 'last',
'总市值': 'last',
})
print(df_week)
转换的结果如下:
股票代码 股票名称 开盘价 最高价 最低价 收盘价 前收盘价 成交量 成交额 流通市值 总市值
交易日期
1991-01-06 sz000001 深发展A 66.40 66.40 66.07 66.07 66.40 38000.0 2.519000e+06 2.451197e+09 4.486153e+09
1991-01-13 sz000001 深发展A 66.42 66.42 65.10 65.10 65.43 56000.0 3.709000e+06 2.415210e+09 4.420290e+09
1991-01-20 sz000001 深发展A 64.45 64.45 63.20 63.20 63.49 38200.0 2.447000e+06 2.344720e+09 4.291280e+09
1991-01-27 sz000001 深发展A 62.54 62.54 61.30 61.30 61.62 18400.0 1.142000e+06 2.274230e+09 4.162270e+09
1991-02-03 sz000001 深发展A 60.39 60.39 60.09 60.39 60.09 234400.0 1.414400e+07 2.240469e+09 4.100481e+09
... ... ... ... ... ... ... ... ... ... ... ...
2022-01-30 sz000001 平安银行 17.34 17.38 15.82 15.83 16.30 565323684.0 9.372506e+09 3.071931e+07 3.071957e+07
2022-02-06 None None NaN NaN NaN NaN NaN 0.0 0.000000e+00 NaN NaN
2022-02-13 sz000001 平安银行 16.02 17.34 15.89 17.10 16.99 618402973.0 1.035538e+10 3.318384e+07 3.318412e+07
2022-02-20 sz000001 平安银行 17.10 17.15 16.10 16.77 16.42 473832371.0 7.805581e+09 3.254345e+07 3.254372e+07
2022-02-27 sz000001 平安银行 16.66 16.67 15.80 15.90 15.91 463317764.0 7.472203e+09 3.085515e+07 3.085541e+07
这样就实现了将日K线的数据转换为周K线的数据
如果想将日K转换成月K,只需要改变resample函数里面的rule值
rule表示的是你放一个什么样的周期性指标在里面,用M代表Month,Y代表Year,W代表Week