如何遍历DataFrame行调用单个API批量获取气象站年度数据
解决你的气象API调用问题
嘿,我来帮你搞定这个问题!你的代码里有几个关键问题导致了那个InvalidSchema报错,咱们一步步理清楚并修正:
错误根源分析
- URL构建错误:你在拼接URL时用了
distances['API ID'],这是整个DataFrame的列(所有站点ID的集合),不是当前要请求的单个站点ID。这会让URL里混入类似0 "http://..." Name : API ID, Length: 497...的无效内容,直接触发了连接适配器找不到的错误。 - 函数逻辑混乱:
callAPI函数接收的是单个站点ID,但里面却写了for IDs in range(len(API_id))——这里API_id是单个字符串,len(API_id)是字符串的长度,完全不是遍历站点的逻辑。而且函数没有return任何数据,导致调用后data是None,根本没法存入列表。
修正后的完整代码
import requests import pandas as pd def callAPI(api_id): # 用f-string拼接正确的URL,确保只传入单个站点ID url = ( f'http://www.ncei.noaa.gov/access/services/data/v1?dataset=daily-summaries' f'&dataTypes=PRCP,SNOW,TMAX,TMIN&stations={api_id}' f'&startDate=2020-01-01&endDate=2020-12-31&includeAttributes=0' f'&includeStationName=true&units=standard&format=json' ) try: # 发送GET请求,添加超时避免程序卡住 response = requests.get(url, timeout=10) # 检查请求是否成功,失败则抛出异常 response.raise_for_status() # 返回解析后的JSON数据 return response.json() except requests.exceptions.RequestException as e: # 捕获请求异常,打印错误信息方便排查 print(f"请求站点 {api_id} 时出错: {str(e)}") return None # 初始化列表存储所有站点的气象数据 all_station_data = [] # 这里替换成你的原始distances DataFrame # distances = pd.read_csv("你的文件路径.csv") # 遍历每个站点 for _, row in distances.iterrows(): station_name = row['Closest Station'] api_id = row['API ID'] print(f"正在获取站点 {station_name} ({api_id}) 的数据...") # 调用API获取当前站点的数据 station_data = callAPI(api_id) if station_data: # 给每条日数据添加站点名称和ID,方便后续区分 for daily_record in station_data: daily_record['Closest Station'] = station_name daily_record['API ID'] = api_id # 将当前站点的所有日数据加入总列表 all_station_data.extend(station_data) # 将所有数据合并成一个最终的DataFrame final_weather_df = pd.DataFrame(all_station_data) # 查看结果前5行 print(final_weather_df.head())
关键修正点说明
- 正确拼接URL:用f-string替代字符串加法,既清晰又能确保只传入单个站点ID,避免无效URL。
- 完善函数逻辑:
callAPI现在专门处理单个站点的请求,返回解析后的JSON数据,还添加了异常处理——某个站点请求失败时,程序不会崩溃,还能打印错误信息帮你排查。 - 优化数据存储:把站点名称和ID添加到每条日数据中,这样最终的DataFrame能明确区分不同站点的数据;用
extend替代append,把每个站点的多条日数据平铺开,避免嵌套列表。
内容的提问来源于stack exchange,提问作者amanda
相关产品推荐
相关产品推荐

