如何同时遍历多个API调用与字典键,提取OpenWeatherMap预报数据生成DataFrame
实现方案
完整可运行代码
import requests import pandas as pd # 基础配置 API_URL = "https://api.openweathermap.org/data/2.5/onecall" APP_ID = "be02e7c76c38ec4e28e37a166d60abb7" # 坐标列表,可直接扩容到35个城市 coords = [ ("48.6355232", "-1.5102571"), ("47.3215806", "5.0414701") ] # 定义需要提取的字段:(列名, 字典取值路径),新增字段只需修改此处 field_rules = [ ("date", ["daily", "dt"]), ("temperature", ["daily", "temp", "day"]), ("wind_speed", ["daily", "wind_speed"]), ("clouds", ["daily", "clouds"]) ] result_rows = [] for lat, lon in coords: # 请求接口 resp = requests.get(API_URL, params={ "lat": lat, "lon": lon, "exclude": "hourly,current,minutely", "appid": APP_ID }) if resp.status_code != 200: print(f"坐标{lat},{lon}请求失败,状态码{resp.status_code}") continue data = resp.json() city_lat = data["lat"] city_lon = data["lon"] # 遍历7天预报数据 for daily_item in data["daily"]: row = { "lat": city_lat, "lon": city_lon } # 按预设规则提取字段 for col_name, path in field_rules: val = daily_item if path[0] == "daily" else data for key in path[1:]: val = val[key] # 时间戳转可读日期 if col_name == "date": val = pd.to_datetime(val, unit="s").date() row[col_name] = val result_rows.append(row) # 生成目标DataFrame df = pd.DataFrame(result_rows) print(df.head())
逻辑说明
- 预先定义字段提取规则,不需要在循环中硬编码写死字典键的取值逻辑,后续要新增字段只要修改
field_rules列表即可 - 遍历坐标列表发起请求时,自动复用同一套字段提取逻辑,不需要重复写取值代码
- 内置了请求失败的判断逻辑,避免某个城市接口报错导致整个程序中断
- 自动将时间戳转为可读的日期格式,也可以根据需要调整输出格式
内容的提问来源于stack exchange,提问作者valskyyy
相关产品推荐
相关产品推荐

