使用 xarray 将 metpy 计算变量写入 netcdf
Write metpy calculated variables to netcdf with xarray
尝试使用 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, lat, 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()
将持有 Quantity
实例的所有 DataArray
转回其基本(支持 numpy 数组的)版本。
尝试使用 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, lat, 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()
将持有 Quantity
实例的所有 DataArray
转回其基本(支持 numpy 数组的)版本。