resample:频率重采样的规则与坑
我的掌握程度:
先掌握这个答案
语法:df.resample('D').last()(日频取收盘/df.resample('W').last()(周频)。OHLCV的正确聚合:open→first、high→max、low→min、close→last、volume→sum——用agg一次搞定。日历坑:resample('D')生成所有日历日(含周末)→周末行全NaN;解法:先生成交易日索引再reindex(只保留交易日)。降频(分钟→日)=聚合;升频(日→分钟)=拆分/填充——升频通常用ffill但要注明假设。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
打开术语词典,随时查阅基础概念。
背景 · 从一个困惑说起
你有分钟线想变日线、有日线想变周线——resample一行搞定。但它有两个坑:①生成的是日历时间而不是交易日(周末会有空行);②聚合方式要正确选择(open用first、close用last、volume用sum——不能全用mean)。
由此产生的问题
resample的基本语法与聚合选择?日历vs交易日的问题与解法(用交易日历reindex)?降频和升频的区别?
核心概念
语法:df.resample('D').last()(日频取收盘/df.resample('W').last()(周频)。OHLCV的正确聚合:open→first、high→max、low→min、close→last、volume→sum——用agg一次搞定。日历坑:resample('D')生成所有日历日(含周末)→周末行全NaN;解法:先生成交易日索引再reindex(只保留交易日)。降频(分钟→日)=聚合;升频(日→分钟)=拆分/填充——升频通常用ffill但要注明假设。
为什么需要它
①频率转换是因子研究的基础操作:分钟线造日频因子(q-420高频低频化)需要它;②聚合规则的金融含义:high用max而不是mean(高点是极值不是平均)——聚合错了因子含义全变;③日历坑是新手最常见的「莫名多出空白行」来源——理解resample的本质是「按日历时间分组」而非「按交易日分组」。
实际应用场景
标准代码:df.resample('D').agg({'open':'first','high':'max','low':'min','close':'last','volume':'sum'})——然后reindex到交易日历去掉周末。
与之前知识的联系
q-319(datetime索引)是resample的前置条件;q-068(交易日历)是解法;分钟转日频是q-420(高频低频化)的第一步。
⚠ 常见误解
- resample('D')只生成交易日:不——它生成所有日历日(周一到周日)→周末NaN行;要删掉或reindex到交易日
- 所有列都用mean聚合:OHLCV各有正确聚合(first/max/min/last/sum)——mean会把最高价平均掉
- resample=rolling:完全不同——resample改变频率(降维/升维);rolling在原频率上滑窗统计
🛠 本题实践任务
下载一只股票5分钟线一天(或构造模拟240根)——用agg正确转为日线K线——对照行情软件的日K(open/close/volume应一致)。
💡 提示(先自己想5分钟再看)
resample('D')后dropna()或reindex(trading_days)——两种方式去掉周末;high用max——如果5分钟线里有high列的话。
✅ 验收标准
一根正确的日K数字(O/C/V三个值)+与行情软件对照。你的频率转换工具就位。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(datetime索引),再用案例、公式和代码帮助理解。此功能需要先启用服务。