Python使用Resample函数转换日K线到周K线和月K线
日K线到周K线和月K线,如果用resample函数,最大的问题是时间会自动填补。
周线,我们只需要到星期五,他会填补到星期天的日期。
月线,我们只需要月底最后一个交易日,他会填补到月底最后一天的日期。
花了很多时间,找了很多资料,最终的解决办法如下
Copy your index as column, aggregate date to get the max (or last if sorted) and set back as index:
df['date'] = df.index
(df.resample('BM')
.agg({'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'date': 'max',
})
.set_index('date')
)
代码来自:https://stackoverflow.com/questions/68890136/pandas-resample-from-daily-to-monthly-using-original-datetime-index
股票因为有停牌节假日等因素,补充一个代码
df.dropna(inplace=True)
BM表示一个月里的工作日,更多选择参考:‘A’, ‘Q’, ‘BM’, ‘BA’, ‘BQ’ meaning in resample
还有一个不用resample,用groupby的方式来实现的,不过这种方式适合写入到csv文件,直接读取会有些问题。
有兴趣的自己阅读:https://www.techtrekking.com/how-to-convert-daily-time-series-data-into-weekly-and-monthly-using-pandas-and-python/
至于reasample函数的应用,参考下面的文章
转自:https://www.jb51.net/article/213955.htm
resample函数是Python数据分析库Pandas的方法函数,它主要用于转换时间序列的频次,今天通过本文给大家分享python使用Resample函数转换时间序列的相关知识,感兴趣的朋友一起看看吧
使用Resample函数转换时间序列
一、什么是resample函数?
它是Python数据分析库Pandas的方法函数。
它主要用于转换时间序列的频次。可以做一些统计汇总的工作。
什么叫转换时间序列的频次呢?
比如说股票的日k和周k,
假设我只能获取到股票日K的数据,比如说11月1号到11月5号,那怎么样将它转换为以周为单位的K线呢?
日期 | 周期 | 开盘价 | 收盘价 | 最高价 | 最低价 |
---|---|---|---|---|---|
11月1号 | 周一 | 1.11 | 1.11 | 1.11 | 1.12 |
11月2号 | 周二 | 1.12 | 1.12 | 1.11 | 1.12 |
11月3号 | 周三 | 1.13 | 1.13 | 1.11 | 1.12 |
11月4号 | 周四 | 1.15 | 1.14 | 1.11 | 1.12 |
11月5号 | 周五 | 1.14 | 1.15 | 1.11 | 1.12 |
首先我们要明确,周K的开盘、收盘、最高、最低是什么。每周的开盘价是当周第一天的开盘价,收盘价是当周最后一天的收盘价,它的最高价是这周最高的价格,最低价是本周所有最低价中最低的价格。所以你去看炒股平台,它的周k都是以周五的交易日为记录的时间点位置。开盘、收盘、最高、最低是按照我刚刚讲解的这个规则来计算的。至于月K、年K的选取规则也是一样的。月K的周期是一个月,年K的周期是一年。
这个计算准确性你也可以通过网上的数据进行验证。这个计算规则,包括开盘、收盘、最高、最低的计算,收拾resample函数可以做到的事情。此外Resample还有个功能,就是做统计汇总,比如说我想计算一支股票总的周成交量,就可以使用Resample.sum函数去把周一到周五的成交量加起来。
为了方便大家记忆 ,你也可以把resample理解为Excel表格中的透视表功能。你可以按照日期做各种筛选和汇总统计的。最重要的是他可以按照日期。
二、实战Resample函数
因为这2节课还是一些比较基础的部分,所以还没有做模块化的内容。
我们会在创建股票数据库的时候 来做真正的模块化的工作。到这里都是初级的脚本的形式。先提前说下。
1.日K 转换为 周K
1.1函数文档学习
谷歌搜索Pandas Resample
:第一个链接就是这个函数的官方文档
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
这里有介绍:Resample是属于Pandas DataFrame下面的方法。这里有关于参数的解释。
这里我们只对2个常用参数讲解,一个是rule,另一个是closed。
- rule表示的是你放一个什么样的周期性指标在里面,用m代表Month,Y代表Year,w代表Week,
- closed代表你取哪一个分界线,举例来说,比如说我把日k转换为周k,到底我是取周一为分界线还是周五为分界线呢?这就是通过closed来确定的。
这里有它的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>>index = pd.date_range( '1/1/2000' , periods = 9 , freq = 'T' ) >>>series = pd.Series( range ( 9 ), index = index) >>>series 2000 - 01 - 01 00 : 00 : 00 0 2000 - 01 - 01 00 : 01 : 00 1 2000 - 01 - 01 00 : 02 : 00 2 2000 - 01 - 01 00 : 03 : 00 3 2000 - 01 - 01 00 : 04 : 00 4 2000 - 01 - 01 00 : 05 : 00 5 2000 - 01 - 01 00 : 06 : 00 6 2000 - 01 - 01 00 : 07 : 00 7 2000 - 01 - 01 00 : 08 : 00 8 Freq: T, dtype: int64 |
这里首先创建了一个时间序列的DataFrame
,就是这个series
变量。你可以理解为它是一个只有一个字段的表格样式。接着往下看:
1
2
3
4
5
|
>>>series.resample( '3T' ). sum () 2000 - 01 - 01 00 : 00 : 00 3 2000 - 01 - 01 00 : 03 : 00 12 2000 - 01 - 01 00 : 06 : 00 21 Freq: 3T , dtype: int64 |
这里使用了Resample
方法,3T
就是3分钟,T
表示分钟。sum()
就是汇总,也就是针对这一列数据进行汇总。
也就是说,每3分钟统计依次。注意到,这个时间序列汇总的时间取的值是3分钟的第一分钟。如果我想取时间周期的最后一分钟,可以将label的值改为“right":
1
2
3
4
5
|
>>>series.resample( '3T' , label = 'right' ). sum () 2000 - 01 - 01 00 : 03 : 00 3 2000 - 01 - 01 00 : 06 : 00 12 2000 - 01 - 01 00 : 09 : 00 21 Freq: 3T , dtype: int64 |
1.2实战
获取日K真实的数据:
1
2
3
|
#获取日k df = get_price( "000001.XSHG" , end_date = '2021-05-30 14:00:00' ,count = 20 , frequency = '1d' , fields = [ 'open' , 'close' , 'high' , 'low' , 'volume' , 'money' ]) print (df) |
可以看到获取到了4月28号
到5月28号
的所有数据。为了更方便理解 我们再添加一列数据,就是当前日期是星期几
的列。
1
2
3
4
|
#获取日k df = get_price( "000001.XSHG" , end_date = '2021-05-30 14:00:00' ,count = 20 , frequency = '1d' , fields = [ 'open' , 'close' , 'high' , 'low' , 'volume' , 'money' ]) df[ 'weekday' ] = df.index.weekday print (df) |
这里0
代表周一,这里如何转换为按“周”统计呢
1
2
3
4
5
|
#获取周k import pandas as pd df_week = pd.DataFrame() df_week = df[ 'open' ].resample( 'W' ).first() print (df_week) |
可以看到这里的2021-05-30
是一个礼拜的最后一天。它对应的开盘价确实是这个数字。说明我们计算的周K数据是正确的。
收盘价就是每周收盘价
最后一天的数据。
最高价就是每周收盘价
的最大值。
最低价就是每周收盘价
的最小值。
1
2
3
4
5
6
7
8
|
#获取周k import pandas as pd df_week = pd.DataFrame() df_week[ 'open' ] = df[ 'open' ].resample( 'W' ).first() df_week[ 'close' ] = df[ 'close' ].resample( 'W' ).last() df_week[ 'high' ] = df[ 'high' ].resample( 'W' ). max () df_week[ 'low' ] = df[ 'low' ].resample( 'W' ). min () print (df_week) |
对比数据,close是最后一天的收盘价的数据。high是当前周的每天的最高价的最高价。low是当前周的每天的最低价的最低价。
我们通过不到10行代码就能将日K
的数据转换为周K
的数据。
2.汇总统计功能(统计月成交量、成交额)
汇总成交量和成交额
我想要把volume
(成交量)和money
(成交额)转换为总成交量和总成交额
1
2
3
4
5
6
7
8
9
10
|
#获取周k import pandas as pd df_week = pd.DataFrame() df_week[ 'open' ] = df[ 'open' ].resample( 'W' ).first() df_week[ 'close' ] = df[ 'close' ].resample( 'W' ).last() df_week[ 'high' ] = df[ 'high' ].resample( 'W' ). max () df_week[ 'low' ] = df[ 'low' ].resample( 'W' ). min () df_week[ 'volume(sum)' ] = df[ 'volume' ].resample( 'W' ). sum () df_week[ 'money(sum)' ] = df[ 'money' ].resample( 'W' ). sum () print (df_week) |
3.日K 转换为 月K
假设我有一年的数据,如果想转换为月K应该怎么转?
只需要改2个地方:
- 添加
start_date
获取到一整年的数据 - 将
resample
的参数改为M即可,M代表Month
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#获取日k df = get_price( "000001.XSHG" , end_date = '2021-05-30 14:00:00' , start_date = '2020-05-30' , frequency = '1d' , fields = [ 'open' , 'close' , 'high' , 'low' , 'volume' , 'money' ]) df[ 'weekday' ] = df.index.weekday print (df) #获取周k import pandas as pd df_week = pd.DataFrame() df_week[ 'open' ] = df[ 'open' ].resample( 'M' ).first() df_week[ 'close' ] = df[ 'close' ].resample( 'M' ).last() df_week[ 'high' ] = df[ 'high' ].resample( 'M' ). max () df_week[ 'low' ] = df[ 'low' ].resample( 'M' ). min () print (df_week) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具