如何从NASA POWER API批量获取CSV格式的点位气象数据?
批量获取并保存NASA POWER API的CSV数据
问题分析
你的代码存在几个关键问题:
- 缺少
pandas和io模块的导入 - 读取CSV时变量引用错误(误写为
content而非response.content) - 文件保存的代码块未完成
- 可以直接写入API返回的原始CSV内容,无需先转成DataFrame再保存,效率更高
修正后的完整代码
import os import requests import pandas as pd import io # 假设df是你的目标数据集 lat = df['lat'].values.tolist() long = df['long'].values.tolist() stations = df['station'].values.tolist() # 关联站点名,方便区分输出文件 output_dir = r"C:\Users\....." # 确保输出目录存在,避免报错 os.makedirs(output_dir, exist_ok=True) base_url = r"https://power.larc.nasa.gov/api/temporal/monthly/point?parameters=PS,WS10M_RANGE&community=SB&longitude={longitude}&latitude={latitude}&format=CSV&start=2018&end=2021" for station_name, latitude, longitude in zip(stations, lat, long): api_request_url = base_url.format(longitude=longitude, latitude=latitude) try: response = requests.get(url=api_request_url, verify=True, timeout=30.00) response.raise_for_status() # 检查请求是否成功 # 方式1:直接写入原始CSV内容(高效,无需解析) filename = f"{station_name.replace(' ', '_')}_weather_data.csv" filepath = os.path.join(output_dir, filename) with open(filepath, 'w', encoding='utf-8') as file_object: file_object.write(response.text) # 方式2:若需预处理数据,转成DataFrame后保存 # content_df = pd.read_csv(io.BytesIO(response.content), encoding='utf8', sep=",") # content_df['station'] = station_name # 新增站点标识列 # content_df.to_csv(filepath, index=False, encoding='utf-8') print(f"已保存 {station_name} 的数据到 {filepath}") except requests.exceptions.RequestException as e: print(f"获取 {station_name} 数据失败: {str(e)}")
关键说明
- 依赖补充:添加
pandas和io模块导入,保证代码可正常运行 - 目录校验:用
os.makedirs确保输出目录存在,避免因目录缺失报错 - 文件名优化:用站点名命名文件,比API默认的
power_*.csv更易识别 - 异常处理:通过
try-except捕获请求异常,避免单个点位失败导致整个程序中断 - 两种保存方案:按需选择直接写入原始内容(高效)或转DataFrame预处理(灵活)
内容的提问来源于stack exchange,提问作者erdem
相关产品推荐
相关产品推荐

