You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于NASA-Power API批量获取数据集中所有坐标的气象参数

批量调用NASA POWER API获取多经纬度数据并保存

问题背景

我需要调用NASA POWER API获取数据集中123个经纬度点的气象参数,但该API仅支持单个坐标请求,手动逐一操作不现实。我的数据存储在DataFrame df 中,结构如下:

stationlonglat
Station 150.8060.80
Station 24547

我尝试了一段循环代码,但因为未正确定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:15:04