关于使用 Python xarray 将经度数组从 0 - 360 更改为 -180 到 180

SMa*_*Maj 3 python python-xarray

我是一名 matlab 用户,最近尝试更多地使用 Python 进行计算。我正在使用 xarray 并希望将我的经度数组从地球物理场的 0 - 360 更改为 -180 到 180。但是当我这样做时:

df=xr.open_dataset(ecmwf_winds.nc)
u10=df['u10']
lon=df['longitude']
lon = np.where(lon > 180, lon-360, lon)
[X,Y]=np.meshgrid(lon,df.latitude)
plt.contourf(X,Y,u10)
Run Code Online (Sandbox Code Playgroud)

等高线图因间隙而变得凌乱,这是没有意义的。任何人都可以帮我解决这个问题。我不确定我哪里做错了。

Lig*_*t_B 11

另一种不使用的更快的方法和更简单的方法where

 df.coords['lon'] = (df.coords['lon'] + 180) % 360 - 180
 df = df.sortby(df.lon)
Run Code Online (Sandbox Code Playgroud)

提示:为了快速绘图,您可以使用 Xarrays 内置绘图功能,这样您就不必创建网格。

df.u10.plot()
#or
df.u10.plt.contourf()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,单行解决方案*不起作用*(因为您在设置新的“lon”值之前进行了排序)。两行解决方案有效,谢谢! (2认同)

Mic*_*ado 6

您需要像之前那样分配值,然后沿着新的坐标值对生成的 DataArray 进行排序:

lon_name = 'longitude'  # whatever name is in the data

# Adjust lon values to make sure they are within (-180, 180)
ds['_longitude_adjusted'] = xr.where(
    ds[lon_name] > 180,
    ds[lon_name] - 360,
    ds[lon_name])

# reassign the new coords to as the main lon coords
# and sort DataArray using new coordinate values
ds = (
    ds
    .swap_dims({lon_name: '_longitude_adjusted'})
    .sel(**{'_longitude_adjusted': sorted(ds._longitude_adjusted)})
    .drop(lon_name))

ds = ds.rename({'_longitude_adjusted': lon_name})
Run Code Online (Sandbox Code Playgroud)

  • @Light_B 的[很好的答案](/sf/answers/3749286131/) 应该是公认的答案。用它代替! (2认同)