根据网格的 u 和 v 分量计算风向

问题描述 投票:0回答:1
import xarray as xr
import numpy as np

# Open GRIB with xarray
data_wind = xr.open_dataset('test.grib', engine='cfgrib')

# Extract wind from grib
u_variable = data_wind['u10']
v_variable = data_wind['v10']

# Convert var 
u = u_variable.values
v = v_variable.values


# Compute wind direction
wind_dir = np.mod(180 + (180/np.pi) * np.arctan2(v, u), 360)

嗨,

我目前正在尝试计算网格每个网格点的风向。然而,使用我当前使用的方法,我无法确定 Wind_dir 中使用的 u 和 v 值来自空间和时间上的同一点...... 有谁知道我如何确保情况确实如此?

提前谢谢你

安托万

我尝试设置一个循环来遍历所有点,但没有成功

python python-xarray grib
1个回答
0
投票

假设你的grib文件构建正确,你所担心的事情就可以通过

xarray
的魔力来解决。它“知道”如何匹配坐标和时间,你不需要担心它。

在您的示例中,您可以查看

u.shape
v.shape
的输出。这将为您提供一个表示纬度、经度和时间步长的三成员元组,xarray 使用该元组来匹配这些维度上的数据。
wind_dir.shape
应该给出相同的结果,因为它将具有与输入相同的维度。如果这些不相同,您将在 Wind_dir 计算步骤中收到错误。

这是一个你可以玩的例子

import pandas as pd

ds = xr.Dataset(
    {
        "v": xr.DataArray(
            [
                [[1.1, 2.2, 3.3], [2.2, 3.3, 4.4], [4.4, 5.5, 6.6]],
                [[1.2, 2.3, 3.4], [2.3, 3.4, 4.5], [4.5, 5.6, 6.7]],
            ],
            coords={
                "time": pd.DatetimeIndex(["2023-11-07", "2023-11-08"]),
                "latitude": [-10.25, -11.25, -12.25],
                "longitude": [112.25, 113.25, 114.25],
                    },
            dims=["time", "latitude", "longitude"],
            attrs={"long_name": "some variable"},
        ),
    },
)

# create u variable 
ds["u"] = ds.v

print(ds.v.shape) # (2, 3, 3)
print(ds.u.shape) # (2, 3, 3)

ds.v - ds.u # array of zeros

PS。您可以像这样稍微简化方向计算:

wind_dir = np.degrees(np.arctan2(u, v)) % 360
© www.soinside.com 2019 - 2024. All rights reserved.