Я пытаюсь сделать простой выбор данных о погоде (NCEP Reanalysis 2) в диапазоне долгот 80W-30E, чтобы получить Atlanti c Ocean. Я нашел это сообщение о той же проблеме. Однако решение, данное в этом посте, у меня не сработало.
Вот моя цифра с пустой строкой в меридиане 0:
А вот и мой рисунок с использованием решения, приведенного в этом сообщении 1 :
Ниже приведен код:
arq = xr.open_dataset( 'mslp.2014.nc' )
mslpAtl = arq.mslp.roll( lon=32, roll_coords=True ).sel( lat=slice(0,-70), lon=slice(280,30) )
new_lon = mslpAtl.lon.values
new_lon[1:] += np.cumsum( np.diff( mslpAtl.lon ) < -180 ) * 360
mslpAtl.assign_coords( lon=new_lon )
ax = plt.axes( projection=ccrs.PlateCarree() )
mslpAtl.isel( time=0 ).plot.contourf( ax=ax, transform=ccrs.PlateCarree() )
ax.coastlines()
ax.set_xlim( -80, 30 )
ax.set_ylim( -70, 0 )
plt.savefig('teste1.png')
plt.show()
Ниже результаты несколько команд печати, просто для сравнения с сообщением 1 :
print( mslpAtl.lon )
результаты координат долготы после применения roll
<xarray.DataArray 'lon' (lon: 45)>
array([280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5, 300. , 302.5,
305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5, 325. , 327.5,
330. , 332.5, 335. , 337.5, 340. , 342.5, 345. , 347.5, 350. , 352.5,
355. , 357.5, 0. , 2.5, 5. , 7.5, 10. , 12.5, 15. , 17.5,
20. , 22.5, 25. , 27.5, 30. ], dtype=float32)
Coordinates:
* lon (lon) float32 280.0 282.5 285.0 287.5 290.0 ... 22.5 25.0 27.5 30.0
Attributes:
units: degrees_east
long_name: Longitude
actual_range: [ 0. 357.5]
standard_name: longitude
axis: X
coordinate_defines: point
Затем команда
print( np.diff( mslpAtl.lon ) < -180 )
определяет большое расстояние между точками данных
[False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False True False False False False
False False False False False False False False]
И команда
print( np.cumsum( np.diff( mslpAtl.lon ) < -180 ) )
дает
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
1 1 1 1 1 1 1]
и, наконец, команду
print( new_lon )
дает измененные координаты долготы, присвоенные данным.
[280. 282.5 285. 287.5 290. 292.5 295. 297.5 300. 302.5 305. 307.5
310. 312.5 315. 317.5 320. 322.5 325. 327.5 330. 332.5 335. 337.5
340. 342.5 345. 347.5 350. 352.5 355. 357.5 360. 362.5 365. 367.5
370. 372.5 375. 377.5 380. 382.5 385. 387.5 390. ]
Что было бы неправильным в приведенном выше коде? Спасибо!