Press "Enter" to skip to content

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

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

发表评论

您的电子邮箱地址不会被公开。