按日期拆分Alpha Vantage返回JSON为多份CSV并补全缺失值解决报错
报错原因与优化实现
报错根源
你的代码触发TypeError: 'list' object is not callable是因为变量命名冲突:
- 你自定义了名为
open的列表变量,覆盖了Python内置的open()文件操作函数,后续执行文件写入调用open()时,Python会尝试把你定义的列表当做函数调用,直接触发报错。 - 另外自定义函数
num_el中用list作为参数名,覆盖了Python内置的list类,也属于潜在风险。
优化后实现方案
你要实现的按日期拆分、补全缺失1分钟间隔的需求,用Pandas内置的时间序列能力可以大幅简化逻辑,代码如下:
import requests import pandas as pd import numpy as np # 配置参数 symbol = "MSFT" api_key = 'APIKEYHERE' symbol_list = symbol.split(",") for ticker in symbol_list: # 拉取接口数据 url = f'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol={ticker}&outputsize=full&interval=1min&apikey={api_key}' resp = requests.get(url) raw_data = resp.json() # 转换为DataFrame并格式化时间字段 df = pd.DataFrame(raw_data['Time Series (1min)']).T df.index = pd.to_datetime(df.index) df.index.name = 'time' df = df.reset_index() # 字段重命名统一格式 df = df.rename(columns={ '1. open': 'Open', '2. high': 'High', '3. low': 'Low', '4. close': 'Close', '5. volume': 'Volume' }) # 按日期分组处理 for date, group in df.groupby(df['time'].dt.date): # 设置时间为索引,按1分钟频率重采样,自动补全缺失的时间间隙 daily_df = group.set_index('time').resample('1min').asfreq() # 新增是否空缺标记字段 daily_df['Empty Value'] = daily_df['Open'].isna() # 提取时间部分作为索引 daily_df.index = daily_df.index.time daily_df.index.name = 'Time' # 输出到csv daily_df.to_csv(f"{ticker}_1min_{date}.csv")
主要优化点
- 修复了变量命名冲突问题,所有变量不再使用Python内置关键字/函数名
- 用
resample('1min').asfreq()直接实现缺失1分钟间隔的补全,无需手动生成时间范围再合并 - 直接按日期字段分组,省去了手动计算分组长度、偏移量的冗余逻辑
- 去掉了循环拆分列、拼接列的冗余操作,直接重命名列后即可输出
- 简化了股票列表遍历逻辑,无需手动维护循环计数器
内容的提问来源于stack exchange,提问作者FOURZA07
相关产品推荐
相关产品推荐

