将单位属性添加到 xarray 对象

Adding unit attributes to an xarray object

我创建了一个等压压力水平数组来绘制横截面:

vertical, = cross['isobaric'].metpy.coordinates('vertical')

然而,这个数组的值以 Pa 为单位。为了转换成 hPa,我创建了一个新数组:

vert_hpa = (vertical/100)*units.hPa

然后我想用它来计算潜在温度:

temperature, pressure, relative_humidity = xr.broadcast(cross['temperature'], vert_hpa, cross['relative_humidity'])
theta = mpcalc.potential_temperature(pressure, temperature)

当我尝试 运行 时,出现错误提示我创建并分配给变量 'pressure' 的数组没有任何关联单位:

ValueError: `potential_temperature` given arguments with incorrect units: `pressure` requires "[pressure]" but given "dimensionless".

MetPy units documentation 建议可以使用语法 array_name*units.unit 将单位添加到数组中。为什么我尝试这样做没有成功?

您 运行 遇到的问题是乘法单位适用于 numpy 数组,但不适用于 xarray.DataArray 个实例——这就是您获得 vertical 时得到的结果。如果不是这样就好了,但目前这就是我们生活的世界。为了解决这个问题,MetPy 为 xarray and units.

提供了一些有用的工具

不过,在这种情况下,无需手动将单位从 Pa 转换为 hPa——单位支持的优点在于单位已知且维度适当,potential_temperature不在乎它们是什么。这就是我编写代码的方式:

vertical = data['temperature'].metpy.vertical
temperature, pressure, relative_humidity = xr.broadcast(data['temperature'],
                                                        vertical,
                                                        data['relative_humidity'])
theta = mpcalc.potential_temperature(pressure, temperature)

为了将来参考,如果您确实需要获取一个 xarray 并将其转换为仅附加单位的裸 numpy 数组,您可以使用 unit_array 属性:

temp_with_units = temperature.metpy.unit_array