转换 metpy 单位 GFS precipitation_rate

convert metpy units GFS precipitation_rate

我按照此处的示例 (https://unidata.github.io/python-gallery/examples/Precipitation_Map.html) 但是在尝试访问单位时出现维度错误。我假设这与 pint 及其解析单位的方式有关,事实上降水是一个比率。任何帮助将不胜感激

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import metpy
import datetime
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from xarray.backends import NetCDF4DataStore
import xarray as xr
import numpy as np
from metpy.units import masked_array, units
from siphon.catalog import TDSCatalog



best_gfs = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/'
                      'Global_0p25deg/catalog.xml?dataset=grib/NCEP/GFS/Global_0p25deg/Best')
best_gfs.datasets


best_ds = list(best_gfs.datasets.values())[0]
ncss = best_ds.subset()

query = ncss.query()
query.lonlat_box(-66.243114,-25.762908,-28.708933, -2.191886).time_range(datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(days=10))
query.accept('netcdf4')
query.variables('Precipitation_rate_surface')
data = ncss.get_data(query)
data = xr.open_dataset(NetCDF4DataStore(data))

lon_2d, lat_2d = np.meshgrid(data['lon'], data['lat'])
precip = data['Precipitation_rate_surface']

precip.metpy.units

这是因为该变量的单位字符串是 kg.m-2.s-1,这是一个 UDUnits-compatible 字符串,但不适用于 Pint 中的默认单位解析器,这就是MetPy 用于单元支持。

这已在 MetPy 1.0 中修复。您可以使用 conda 安装 MetPy 1.0 的第二个候选版本:

conda install -c conda-forge/label/metpy_rc metpy=1.0

或使用 pip:

pip install --pre metpy=1.0

MetPy < 1.0 的解决方法是在调用 precip.metpy.units 之前覆盖单元元数据:

precip.attrs['units'] = 'kg m^-2 s^-1'