首页 > 解决方案 > 将单元属性添加到 xarray 对象

问题描述

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

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)

当我尝试运行它时,我收到一个错误,表明我创建并分配给变量“压力”的数组没有任何关联的单位:

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

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

标签: python-xarraymetpy

解决方案


您遇到的问题是乘法单元适用于 numpy 数组,但不适用于xarray.DataArray实例 - 这是您在获得vertical. 如果不是这样就好了,但目前这就是我们生活的世界。为了解决这个问题,MetPy 有一些对xarray 和 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

推荐阅读