使用 xarray 将 metpy 计算变量写入 netcdf

问题描述

尝试使用 xarray 将来自 metpy 计算的输出写入 netcdf 文件时出现错误TypeError: Argument 'data' has incorrect type (expected numpy.ndarray,got Quantity)

这似乎是包含单位信息的metpy的结果,并将变量的数据转换为Pint.Quantity,而不是np.ndarray,但我想不出一种在两者之间进行转换的方法,而将它保存在 xarray 中(我想这样做以维护坐标数据)。

这是示例代码(使用 NCEP 空气温度重新分析):

import xarray as xr
import metpy.calc as mpcalc
data = xr.open_dataset('air.2005.nc')
data['theta'] = mpcalc.potential_temperature(data['level'],data['air'])
data.to_netcdf('theta.2005.nc')

这给出了错误TypeError: Argument 'data' has incorrect type (expected numpy.ndarray,got Quantity)

进行 theta 计算后,数据如下:

<xarray.Dataset>
Dimensions:  (lat: 91,level: 17,lon: 180,time: 365)
Coordinates:
  * time     (time) datetime64[ns] 2005-01-01 2005-01-02 ... 2005-12-31
  * lon      (lon) float64 -180.0 -178.0 -176.0 -174.0 ... 174.0 176.0 178.0
  * lat      (lat) float64 -90.0 -88.0 -86.0 -84.0 -82.0 ... 84.0 86.0 88.0 90.0
  * level    (level) float32 1e+03 925.0 850.0 700.0 ... 50.0 30.0 20.0 10.0
Data variables:
    air      (time,level,lat,lon) float32 ...
    theta    (level,time,lon) float32 <Quantity([[[[272.32    272.32  ...
Attributes:
    CDI:            climate Data Interface version 1.9.8 (https://mpimet.mpg....
    Conventions:    COARDS
    history:        Wed Nov 25 14:51:47 2020: cdo remap,twoDegreeGrid,remapwe...
    title:          4x daily NMC reanalysis (2005)
    description:    Data is from NMC initialized reanalysis\n(4x/day).  It co...
    platform:       Model
    References:     http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reana...
    dataset_title:  NCEP-NCAR Reanalysis 1
    CDO:            climate Data Operators version 1.9.8 (https://mpimet.mpg....

是否可以将metpy计算的输出写入netCDF?

解决方法

我完全无法重现您遇到的错误,尽管我知道这在某些时候肯定是一个问题,因此您可能需要考虑将您的 metpy、xarray、numpy 和 pint 版本更新到最新版本可用版本。

不过,如果没有它,如 MetPy 的 Xarray tutorial 中所述,您应该能够:

data.metpy.dequantify()

将所有持有 DataArray 实例的 Quantity 转回它们的基本(numpy-array-backed)版本。