如何基于NASA-Power API批量获取数据集中所有坐标的气象参数
批量调用NASA POWER API获取多经纬度数据并保存
问题背景
我需要调用NASA POWER API获取数据集中123个经纬度点的气象参数,但该API仅支持单个坐标请求,手动逐一操作不现实。我的数据存储在DataFrame df 中,结构如下:
| station | long | lat |
|---|---|---|
| Station 1 | 50.80 | 60.80 |
| Station 2 | 45 | 47 |
我尝试了一段循环代码,但因为未正确定义locations变量导致无法运行,代码如下:
lat=df['lat'].values.tolist() long=df['long'].values.tolist() import os, json, requests latitude=lat longitude =long output = r"C:/......." base_url = r"https://power.larc.nasa.gov/api/temporal/daily/point?parameters=T2M,T2MDEW,T2MWET,TS,T2M_RANGE,T2M_MAX,T2M_MIN&community=RE&longitude={longitude}&latitude={latitude}&start=20150101&end=20150305&format=JSON" for latitude, longitude in locations: api_request_url = base_url.format(longitude=longitude, latitude=latitude) response = requests.get(url=api_request_url, verify=True, timeout=30.00) content = json.loads(response.content.decode('utf-8')) filename = response.headers['content-disposition'].split('filename=')[1] filepath = os.path.join(output, filename) with open(filepath, 'w') as file_object: json.dump(content, file_object)
错误原因
未定义locations变量,代码仅将lat和long分别存为列表,但未配对成(纬度,经度)的可遍历元组列表,导致循环无法执行。
修正方案
1. 正确构建坐标对并保存为JSON
直接遍历DataFrame的行提取坐标,优化代码结构并增加异常处理:
import os import json import requests import pandas as pd # 假设你的df已加载完成,示例数据可替换为实际数据集 df = pd.DataFrame({ 'station': ['Station 1', 'Station 2'], 'long': [50.80, 45], 'lat': [60.80, 47] }) output_dir = r"C:/your/output/directory" os.makedirs(output_dir, exist_ok=True) # 自动创建输出目录 # 定义API基础URL base_url = ( "https://power.larc.nasa.gov/api/temporal/daily/point?" "parameters=T2M,T2MDEW,T2MWET,TS,T2M_RANGE,T2M_MAX,T2M_MIN&" "community=RE&longitude={longitude}&latitude={latitude}&" "start=20150101&end=20150305&format=JSON" ) # 遍历每个站点的经纬度 for idx, row in df.iterrows(): latitude = row['lat'] longitude = row['long'] station_name = row['station'] # 格式化API请求地址 api_url = base_url.format(longitude=longitude, latitude=latitude) try: # 发送HTTP请求 response = requests.get(api_url, verify=True, timeout=30) response.raise_for_status() # 捕获HTTP错误 # 解析JSON响应 data = json.loads(response.content.decode('utf-8')) # 自定义文件名(用站点名替代默认名称,更易识别) filename = f"{station_name}_weather_data.json" filepath = os.path.join(output_dir, filename) # 保存JSON文件 with open(filepath, 'w', encoding='utf-8') as f: json.dump(data, f, indent=4) print(f"已完成 {station_name} 的数据保存") except requests.exceptions.RequestException as e: print(f"{station_name} 请求失败: {e}")
2. 合并所有数据保存为CSV(可选)
如果需要将所有站点数据合并为单个CSV文件,可在循环中收集数据后统一保存:
import os import json import requests import pandas as pd df = pd.DataFrame({ 'station': ['Station 1', 'Station 2'], 'long': [50.80, 45], 'lat': [60.80, 47] }) output_dir = r"C:/your/output/directory" os.makedirs(output_dir, exist_ok=True) base_url = ( "https://power.larc.nasa.gov/api/temporal/daily/point?" "parameters=T2M,T2MDEW,T2MWET,TS,T2M_RANGE,T2M_MAX,T2M_MIN&" "community=RE&longitude={longitude}&latitude={latitude}&" "start=20150101&end=20150305&format=JSON" ) all_station_data = [] for idx, row in df.iterrows(): latitude = row['lat'] longitude = row['long'] station_name = row['station'] api_url = base_url.format(longitude=longitude, latitude=latitude) try: response = requests.get(api_url, verify=True, timeout=30) response.raise_for_status() data = json.loads(response.content.decode('utf-8')) # 提取每日气象数据并转换为DataFrame daily_params = data['properties']['parameter'] daily_df = pd.DataFrame(daily_params).reset_index().rename(columns={'index': 'date'}) # 添加站点标识和经纬度信息 daily_df['station'] = station_name daily_df['latitude'] = latitude daily_df['longitude'] = longitude all_station_data.append(daily_df) print(f"已收集 {station_name} 的数据") except requests.exceptions.RequestException as e: print(f"{station_name} 请求失败: {e}") # 合并所有数据并保存为CSV if all_station_data: combined_df = pd.concat(all_station_data, ignore_index=True) combined_df.to_csv(os.path.join(output_dir, "all_stations_weather_data.csv"), index=False, encoding='utf-8') print("所有站点数据已合并保存为CSV文件")
注意事项
- 若请求频率过高,建议添加
time.sleep(1)延迟,避免触发API限流 - 确保输出目录路径正确,代码中
os.makedirs会自动创建不存在的目录 - 异常处理可避免单个请求失败导致整个循环终止
内容的提问来源于stack exchange,提问作者erdem
相关产品推荐
相关产品推荐

