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 值来自空间和时间上的同一点...... 有谁知道我如何确保情况确实如此?
提前谢谢你
安托万
我尝试设置一个循环来遍历所有点,但没有成功
假设你的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