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

Siphon库多变量气象数据下载异常:仅部分变量可获取

问题原因与解决办法

问题根源

你遇到的问题不是API限制,而是变量的垂直层级不匹配导致的:

  • 你指定了vertical_level(100000)(即1000hPa等压面),但请求的变量里:
    • u-component_of_wind_isobaric、v-component_of_wind_isobaric是等压面变量,1000hPa层级存在对应数据,所以能正常返回
    • Temperature_surface、Wind_speed_gust_surface是地面层变量,不属于等压面层级,指定1000hPa后NCCS会过滤掉这些不匹配的变量
    • Total_cloud_cover_entire_atmosphere_Mixed_intervals_Average是整层平均变量,也不需要指定等压面层级,同样会被过滤

解决办法

需要根据变量的层级分类请求,或者调整垂直层级参数:

方案1:拆分不同层级的变量分别请求

把地面层、等压面层、整层变量分开请求,再按需合并数据:

from datetime import datetime, timedelta
from siphon.catalog import TDSCatalog

# 按层级分类变量
surface_vars = [
    'Temperature_surface',
    'Wind_speed_gust_surface'
]
isobaric_vars = [
    'u-component_of_wind_isobaric',
    'v-component_of_wind_isobaric'
]
whole_atmos_vars = [
    'Total_cloud_cover_entire_atmosphere_Mixed_intervals_Average'
]

best_gfs = TDSCatalog(
    'http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/'
    'Global_0p5deg/catalog.xml?dataset=grib/NCEP/GFS/Global_0p5deg/Best'
)
ncss = best_gfs.datasets[0].subset()
start, end = datetime.utcnow(), datetime.utcnow() + timedelta(days=1)
target_point = (17.918611, 59.651944)

# 请求地面层变量(无需指定垂直层级)
query_surface = ncss.query()
query_surface.lonlat_point(*target_point).time_range(start, end).variables(*surface_vars).accept("netcdf4")
data_surface = ncss.get_data(query_surface)

# 请求等压面变量(指定1000hPa层级)
query_isobaric = ncss.query()
query_isobaric.lonlat_point(*target_point).vertical_level(100000).time_range(start, end).variables(*isobaric_vars).accept("netcdf4")
data_isobaric = ncss.get_data(query_isobaric)

# 请求整层变量(无需指定垂直层级)
query_whole = ncss.query()
query_whole.lonlat_point(*target_point).time_range(start, end).variables(*whole_atmos_vars).accept("netcdf4")
data_whole = ncss.get_data(query_whole)

# 查看所有获取到的变量(去重坐标变量)
all_vars = list(data_surface.variables) + list(data_isobaric.variables) + list(data_whole.variables)
unique_vars = list(set(all_vars))
print(unique_vars)

方案2:移除垂直层级参数(按需使用)

如果不需要限定等压面层级,可以去掉vertical_level(100000),但注意等压面变量会返回所有可用层级的数据,数据量会变大:

# 修改后的query构建代码
query.lonlat_point(17.918611, 59.651944).time_range(start, end)
query.variables(*variables).accept("netcdf4")

内容的提问来源于stack exchange,提问作者Primoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:35:15