Python获取CON.DE股价时无法存CSV且自动打印DataFrame问题
问题:处理'CON.DE'时DataFrame自动打印且无法保存为CSV
问题描述
用Python编写的股票价格获取代码,对140余个标的(如BMW.DE)均能正常运行,但处理CON.DE时出现两个异常:
- 未调用
print()的情况下,DataFrame自动在终端打印输出 - 无法将DataFrame保存为.csv文件
使用版本:
- yfinance 0.1.77
- pandas 1.5.0
- Python 3.10.8
代码示例:
import pandas as pd import yfinance as yf import os curdir = os.getcwd() def getPrice(ticker): df = yf.Ticker(ticker).history(period ='1mo')[['Open', 'High', 'Low', 'Close', 'Volume']] #Download pricing outputFile = os.path.join(curdir, 'Output', ticker +'.csv') #define path for output file df.to_csv(outputFile) #export as .csv getPrice('CON.DE') #Doesn't save df to .csv and prints df in terminal getPrice('BMW.DE') #Saves df to .csv without issue
排查与解决方案
1. 捕获异常,定位具体错误
先修改代码加入异常捕获和数据检查,明确问题节点:
import pandas as pd import yfinance as yf import os curdir = os.getcwd() def getPrice(ticker): try: # 获取数据并检查基础信息 df = yf.Ticker(ticker).history(period='1mo') print(f"[{ticker}] 数据类型: {type(df)}, 有效行数: {len(df)}") print(f"[{ticker}] 可用列: {list(df.columns)}") # 安全筛选目标列(避免列不存在报错) target_cols = ['Open', 'High', 'Low', 'Close', 'Volume'] df = df[[col for col in target_cols if col in df.columns]] if df.empty: print(f"[{ticker}] 无有效数据,跳过保存") return outputFile = os.path.join(curdir, 'Output', ticker + '.csv') df.to_csv(outputFile) print(f"[{ticker}] 已成功保存到 {outputFile}") except Exception as e: print(f"[{ticker}] 处理失败: {str(e)}") getPrice('CON.DE') getPrice('BMW.DE')
运行后能直接看到:
- 是否因列缺失触发KeyError
- 是否数据为空导致保存失败
- 是否存在路径/权限类错误
2. 针对CON.DE的特殊处理
异常根源大概率是旧版本yfinance对该标的的兼容性bug:
- 返回的DataFrame为空(无可用历史数据)
- 内部触发了不必要的打印输出
- 数据格式异常导致
to_csv执行失败
对应解决动作:
- 升级yfinance到最新版本:0.1.77版本存在不少标的适配问题,执行
pip install --upgrade yfinance后重新测试 - 增加空数据判断:避免对空DataFrame执行保存操作,减少无意义报错
- 安全筛选列:先验证列存在性再筛选,避免硬编码列名引发的KeyError
3. 验证升级效果
升级yfinance后,大部分情况下CON.DE的异常会直接消失。如果该标的确实无可用历史数据,代码中的空数据判断会自动跳过保存,避免终端自动打印和保存失败的问题。
内容的提问来源于stack exchange,提问作者GasGiant314
相关产品推荐
相关产品推荐

