MetPy interpolate_to_grid处理METAR位温时返回全NaN或报错求解
问题根因
- 变量索引错位:你先后两次单独调用
remove_nan_observations分别过滤气温和气压的空值,两次过滤后得到的x_masked/y_masked对应站点索引不匹配,最终计算位温时用的气压和气温不属于同一个站点,本身结果就存在逻辑错误。 - 单位处理不符合接口要求:
potential_temperature返回的是带Pint单位的位温数组(单位为开尔文),而interpolate_to_grid的底层数值计算逻辑要求传入纯数值数组,带单位的数组在赋值时会触发单位不匹配的DimensionalityError,也就是你报错的直接来源。 - 气压计算错误:
altimeter_to_station_pressure接口返回的气压已经是百帕(mbar)单位,你额外乘以33.8639(英寸汞柱转百帕的转换系数)属于多余操作,直接导致计算出的气压值偏离真实情况30多倍,后续位温计算结果完全异常,就算插值逻辑跑通也会返回全NaN。
修复方案
按以下步骤调整代码即可:
- 统一过滤所有变量的空值,保证所有变量的索引一一对应
- 移除气压计算时多余的转换系数
- 插值前提取位温的纯数值,插值完成后再补回单位
- 可以显式指定搜索半径,避免网格点搜不到观测值返回NaN
修正后的关键代码片段
# 统一过滤所有需要的变量,保证索引对齐 df_clean = df.dropna(subset=['longitude', 'latitude', 'air_temperature', 'altimeter', 'elevation']) lon = df_clean['longitude'].values lat = df_clean['latitude'].values xp, yp, _ = mapcrs.transform_points(datacrs, lon, lat).T t2 = df_clean['air_temperature'].values * units('degC') altimeter = df_clean['altimeter'].values * units('mbar') elev = df_clean['elevation'].values * units('m') # 计算站点气压,去掉多余的*33.8639 pres = altimeter_to_station_pressure(altimeter, elev) # 计算位温 potemp = potential_temperature(pres, t2) # 统一过滤空值,提取纯数值传入插值接口 x_masked, y_masked, potemp_clean = remove_nan_observations(xp, yp, potemp.magnitude) # 插值,显式指定搜索半径保证能匹配到足够观测点 grdx = 75000. thgridx, thgridy, theta = interpolate_to_grid(x_masked, y_masked, potemp_clean, interp_type='barnes', kappa_star=6, gamma=0.5, hres=grdx, search_radius=grdx*3) # 给插值结果加回开尔文单位 theta = theta * units.kelvin
内容的提问来源于stack exchange,提问作者jimmyc
相关产品推荐
相关产品推荐

