首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用metpy计算特定湿度时的错误

使用metpy计算特定湿度时的错误
EN

Stack Overflow用户
提问于 2021-06-24 10:31:38
回答 2查看 692关注 0票数 4

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

这是我目前的代码:

代码语言:javascript
运行
复制
# 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)

如果我忽略了“单位”的步骤,那么功能当然会抱怨缺乏单位。请注意,我尝试过两种不同的方法来处理上面的单元,但它们都不起作用。

如果我尝试这种方法:

代码语言:javascript
运行
复制
# assign units (approach 1)
d2m = d2m*units.kelvin
sp = sp*units.pascal

# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)

然后,我得到以下错误:

代码语言:javascript
运行
复制
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")

但是,如果我采用错误信息中建议的单元分配方法,即:

代码语言:javascript
运行
复制
# 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)

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

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
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

我该怎么办?我不知道从这里往哪里走。如能提供任何建议或指导,将不胜感激。

FYI,这是我的各个模块的版本。我将列出所有这些,因为我不确定metpy内部用于单元支持的是什么:

1.19.5

  • xarray 0.16.2

  • pandas 1.1.5

  • 品脱0.17

  • pooch 1.4.0

H 121pyproj 3.0.1

  • matplotlib 2.1.2

  • traitlets 4.3.2H 226H 127scipy 1.0.0H 228F 229

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-06-24 13:06:56

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

你可以这样做:

代码语言:javascript
运行
复制
# 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格式的,因此应该可以工作。如果不是,可能在Xarray特定的Metpy功能页面上的“非CF兼容数据集”一节可能会有所帮助:https://unidata.github.io/MetPy/latest/tutorials/xarray_tutorial.html

票数 5
EN

Stack Overflow用户

发布于 2021-06-24 20:03:55

您所遇到的问题之一是,xr.open_dataset()的结果是一个Dataset,而不是一个DataArray,这正是您真正想要处理的MetPy的计算函数。有了这些之后,MetPy应该能够使用单元元数据自动处理DataArray,如下所示:

代码语言:javascript
运行
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68114074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档