如何高效为股票价格DataFrame添加月内交易日列并规避SettingWithCopyWarning
问题解决方案
警告触发原因
SettingWithCopyWarning是由于你在循环中直接对df['DayOfMonth'].iloc[i]赋值导致的,pandas无法判定你修改的是原DataFrame还是其切片副本,因此抛出安全警告。同时你原来的循环方案属于逐行迭代,面对长时间的行情数据时运行效率会非常低,且存在跨年月份计数错误、初始条件逻辑漏洞等隐性问题。
最优实现方案
直接使用pandas原生的分组+组内计数能力,一行代码即可实现需求,为全向量化运算,运行效率远高于自定义循环,且无逻辑漏洞和警告:
import yfinance as yf import pandas as pd df = yf.download('SPY', start='2020-07-02') pd.set_option("display.max_rows", None, "display.max_columns", None) # 可选:保留你原来的Month列,不需要可以删除 df['Month'] = df.index.month # 按年+月分组,统计每个月的第N个交易日,cumcount从0开始计数所以加1 df['DayOfMonth'] = df.groupby([df.index.year, df.index.month]).cumcount() + 1
效果说明
运行后得到的DayOfMonth结果和你示例的输出完全一致,同时支持跨年的长周期数据计算,不会出现月份匹配错误的问题。
内容的提问来源于stack exchange,提问作者shorttermblog
相关产品推荐
相关产品推荐

