使用xarray、cfgrib处理GRIB2数据触发ValueError元组转换报错如何解决
错误原因与修复方案
核心触发原因
报错ValueError: Could not convert tuple of form (dims, data[, attrs, encoding])是因为构建xarray.Dataset时,声明的坐标维度和实际传入的数组形状不匹配,同时存在低级拼写错误:
- 拼写错误:定义
lon坐标时变量名误写为on,系统找不到对应变量 - 维度声明错误:从GRIB2读取的
latitude、longitude、hybrid均为1维数组,错误声明为2维维度['lat','lon'],形状不匹配 - 维度逻辑错误:定义的变量
data维度为['Alt','lat','lon'],对应的三个坐标Alt、lat、lon应当分别为对应单个维度的1维数组,不能绑定到多维度上
修复后代码
import cfgrib import glob import xarray as xr import pandas as pd folder = input('Folder Path:') val = input('Variable Name:') files = glob.glob(rf'{folder}/*.grib2') data_conc=[] for file in files: data = xr.open_dataset( file, engine='cfgrib', backend_kwargs={'filter_by_keys':{'typeOfLevel': 'hybrid'}} ) lon = data.variables['longitude'].values lat = data.variables['latitude'].values hyb = data.variables['hybrid'].values time = pd.Timestamp(data.time.values) + pd.to_timedelta(data.step.values,'H') # 修正维度声明,坐标维度与数组形状匹配 X = xr.Dataset( data_vars = { 'data':(['Alt','lat','lon'], data[val].values) }, coords = { 'Alt': hyb, 'lat': lat, 'lon': lon, 'time': time }, ) data_conc.append(X) # 如需合并所有文件数据可追加下行 # final_ds = xr.concat(data_conc, dim='time')
额外注意事项
如果你的hybrid参数实际是随经纬度变化的2维场,则需要调整变量维度声明,将data的维度修改为匹配的维度即可。
内容的提问来源于stack exchange,提问作者Ahmed Muhammad Issawi
相关产品推荐
相关产品推荐

