使用Polygon.io获取股票成交量后导出空白Excel问题求助
问题分析与修复方案
你的代码导出Excel仅保留原列的核心原因是Polygon API日期格式不兼容,导致接口返回无效数据,存储成交量的volume_data_df始终为空。以下是具体问题点和修复后的完整方案:
核心问题拆解
- API日期格式错误:Polygon API要求日期参数为
YYYY-MM-DD纯日期格式,但你直接传入Python datetime对象,会生成带时间戳的字符串(如2023-10-01 00:00:00),接口无法识别,返回空结果。 - 空DataFrame赋值风险:初始化
volume_data_df = pd.DataFrame()后,用loc赋值时索引无法与原DataFrame对齐,导致数据无法正确写入。 - 列引用不严谨:用
row[0]、row[1]依赖列顺序,若Excel列顺序变动会直接报错。
修复后的完整代码
import pandas as pd import requests from datetime import timedelta # 读取Excel数据,用列名引用更可靠 df = pd.read_excel(r'C:\Users\patri\Downloads\Volume data.xlsx') # 初始化成交量DataFrame,与原数据索引对齐 volume_data_df = pd.DataFrame(index=df.index) # 遍历每一行数据 for index, row in df.iterrows(): # 改用列名获取日期和股票代码,避免依赖列顺序 date = row['Date'] ticker = row['Ticker'] # 转换为API要求的YYYY-MM-DD格式 end_date = pd.to_datetime(date).strftime('%Y-%m-%d') start_date = (pd.to_datetime(date) - timedelta(days=30)).strftime('%Y-%m-%d') # 构造正确格式的API请求URL api_url = f"https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{start_date}/{end_date}?apiKey=My API KEY" try: response = requests.get(api_url) if response.status_code == 200: data = response.json() if data['status'] == 'OK': results = data['results'] # 填充返回的成交量数据 for i, result in enumerate(results): volume_data_df.loc[index, f"Day {i+1} Volume"] = result['v'] # 若交易日不足30天,补全空值保证30列 for i in range(len(results), 30): volume_data_df.loc[index, f"Day {i+1} Volume"] = None else: print(f"{ticker}数据获取失败:{data['error']}") else: print(f"{ticker}请求失败,状态码:{response.status_code}") except requests.exceptions.RequestException as e: print(f"{ticker}请求异常:{str(e)}") # 合并原数据与成交量数据 combined_df = pd.concat([df, volume_data_df], axis=1) # 导出结果 combined_df.to_excel('Volume Data2.xlsx', index=False)
额外优化说明
- 日期格式强制转换:用
strftime('%Y-%m-%d')确保日期完全符合Polygon API的要求。 - 索引对齐:初始化
volume_data_df时绑定原DataFrame的索引,避免赋值时出现索引不匹配问题。 - 固定30列输出:如果30天内存在非交易日(周末、节假日),自动填充空值保证输出固定30个成交量列。
- 健壮性提升:改用列名引用数据,避免因Excel列顺序变动导致的报错。
内容的提问来源于stack exchange,提问作者Pat Goebel
相关产品推荐
相关产品推荐

