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
相关产品推荐
相关产品推荐

