Об изменении массива долготы с 0 - 360 до -180 до 180 с помощью Python xarray - PullRequest
0 голосов
/ 17 ноября 2018

Я - пользователь 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)

контурная диаграмма оказывается запутанной с пробелами, что не имеет смысла.Может кто-нибудь, пожалуйста, помогите мне с этим.Я не уверен, где я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Другим более быстрым и гораздо более простым подходом без использования where будет

 df.coords['lon'] = (df.coords['lon'] + 180) % 360 - 180
 df = df.sortby(df.lon)

Совет. Для быстрого построения графиков вы можете использовать встроенную функцию построения графиков Xarrays, поэтому вам не нужно создавать сетку.

df.u10.plot()
#or
df.u10.plt.contourf()
0 голосов
/ 25 ноября 2018

Вам нужно присвоить значения, как вы сделали, а затем также отсортировать полученный массив данных по новым значениям координат:

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})
...