使用metpy计算特定湿度时出现错误



我想使用metpy,使用ERA5每小时再分析数据计算近地表(即2m(的比湿度。我昨天刚刚通过pip在本地安装了metpy,所以我假设我的代码是最新的。我的问题是我不断地遇到下面的错误。

这是我目前的代码:

# import modules
import numpy as np
import xarray as xr
from metpy.units import units
import metpy.calc as mpcalc
# read data
d2m = xr.open_dataset('netcdf/ERA5_dewpt2m_1992.nc')
sp = xr.open_dataset('netcdf/ERA5_pres_1992.nc')
# assign units (approach 1)
#d2m = d2m*units.kelvin
#sp = sp*units.pascal
# assign units (approach 2)
d2m = units.Quantity(d2m, "kelvin")
sp = units.Quantity(sp, "pascal")
# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)

如果我忽略";单位;步骤,那么函数当然会抱怨缺少单元。请注意,我已经尝试了两种不同的方法来处理上面的单元,但都不起作用。

如果我尝试这种方法:

# assign units (approach 1)
d2m = d2m*units.kelvin
sp = sp*units.pascal
# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)

然后我得到以下错误:

ValueError: This function changed in 1.0--double check that the function is being called properly.
`specific_humidity_from_dewpoint` given arguments with incorrect units: `pressure` requires "[pressure]" but given "none", `dewpoint` requires "[temperature]" but given "none"
Any variable `x` can be assigned a unit as follows:
from metpy.units import units
x = units.Quantity(x, "m/s")

然而,如果我采用错误消息中建议的单元分配方法,即:

# assign units (approach 2)
d2m = units.Quantity(d2m, "kelvin")
sp = units.Quantity(sp, "pascal")
# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)

然后我得到一个不同的错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-86573b0b8029> in <module>()
----> 1 d2m = units.Quantity(d2m, "kelvin")
2 sp = units.Quantity(sp, "pascal")
3 
4 # calculate specific humidity
5 aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)
~/.local/lib/python3.6/site-packages/pint/quantity.py in __new__(cls, value, units)
201     def __new__(cls, value, units=None):
202         if is_upcast_type(type(value)):
--> 203             raise TypeError(f"Quantity cannot wrap upcast type {type(value)}")
204         elif units is None:
205             if isinstance(value, str):
TypeError: Quantity cannot wrap upcast type xarray.core.dataset.Dataset

我该怎么办?我不知道从这里到哪里去。如果您能提供任何建议/指导,我们将不胜感激。

仅供参考,以下是我的各个模块的版本。我将列出所有这些,因为我不确定metpy内部用于部队支持的内容:

  • python 3.6.3
  • 编号1.19.5
  • xarray 0.16.2
  • 熊猫1.1.5
  • 0.17品脱
  • 小狗1.4.0
  • pyproj 3.0.1
  • matplotlib 2.1.2
  • 开拓者4.3.2
  • scipy 1.0.0

提前感谢。

units.Quantity似乎无法处理Xarray对象。相反,xarray.DataArray对象使用Xarray.DataArray.metpy.quantify方法将数据转换为metpypint.Quantity(请注意,这会将非dask数组加载到内存中(。这将把单位从属性移动到数据。

您可以作为:

# import modules
import numpy as np
import xarray as xr
from metpy.units import units
import metpy.calc as mpcalc
# read data
d2m = xr.open_dataset('netcdf/ERA5_dewpt2m_1992.nc')
sp = xr.open_dataset('netcdf/ERA5_pres_1992.nc')
# assign units
d2m = d2m.metpy.quantify()
sp = sp.metpy.quantify()
# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)

我希望您的ERA5数据是符合CF格式的,所以这应该可以工作。如果不是,也许关于";不符合CF的数据集";在页面上查看特定于Xarray的Metpy功能可能会有所帮助:https://unidata.github.io/MetPy/latest/tutorials/xarray_tutorial.html

您遇到的问题之一是xr.open_dataset()的结果是Dataset,而不是DataArray,这正是您真正希望使用MetPy计算函数的结果。一旦你有了这些,MetPy应该能够自动处理带有单元元数据的DataArray,比如:

import xarray as xr
import metpy.calc as mpcalc
# read data
d2m_ds = xr.open_dataset('netcdf/ERA5_dewpt2m_1992.nc')
sp_ds = xr.open_dataset('netcdf/ERA5_pres_1992.nc')
# Pull out DataArrays and ask MetPy to parse CF metadata
d2m_arr = d2m_ds.metpy.parse_cf('dewpt2m')
sp_arr = sp_ds.metpy.parse_cf('press')
# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp_arr, d2m_arr)

相关内容

  • 没有找到相关文章

最新更新