获取股票Open/High等数据时Pandas DataFrame为空的问题排查
问题排查与修复方案
问题根源
你遇到的空DataFrame问题,核心出在dropna()的默认行为上:
- 调用
.dropna()时未指定how参数,默认会删除任何包含NaN值的行。 - Open/High/Low数据中,部分标的可能在某些日期存在缺失值(比如停牌、数据延迟更新),导致每一行都至少有一个NaN,执行
dropna()后所有行被清空。 - 而Close数据恰好所有标的在统计周期内无缺失值,所以
dropna()后能正常保留数据。
修复步骤
1. 调整dropna()参数(核心修复)
将所有.dropna()调用改为只删除整行全为NaN的行,保留含有效数据的行:
def get_open_data(data): if os.path.exists('open.csv'): # 修改dropna参数为how='all' dataframe = pd.read_csv('open.csv', index_col="Date", parse_dates=True).dropna(how='all') else: data = yf.download(tickers=data, period='1y', interval='1d')['Open'] data.to_csv('open.csv') # 同步修改下载分支的dropna参数 complete_data = data.dropna(how='all') dataframe = pd.DataFrame(complete_data) return dataframe # get_close_data函数也建议同步修改,避免后续出现类似问题 def get_close_data(data): if os.path.exists('close.csv'): dataframe = pd.read_csv('close.csv', index_col="Date", parse_dates=True).dropna(how='all') else: data = yf.download(tickers=data, period='1y', interval='1d')['Close'] data.to_csv('close.csv') complete_data = data.dropna(how='all') dataframe = pd.DataFrame(complete_data) return dataframe
2. 可选:填充缺失值(替代删除)
如果不想删除任何行,可以用填充法处理缺失值,比如前向填充(用前一天的数据填充):
# 读取时替换dropna为fillna dataframe = pd.read_csv('open.csv', index_col="Date", parse_dates=True).fillna(method='ffill')
3. 验证数据状态(排查辅助)
可以在下载数据后打印缺失值统计,确认问题:
data = yf.download(tickers=data, period='1y', interval='1d')['Open'] # 查看数据基本信息 print(data.info()) # 统计每列(每个标的)的缺失值数量 print(data.isna().sum())
内容的提问来源于stack exchange,提问作者custardbun
相关产品推荐
相关产品推荐

