![](/img/trans.png)
[英]Apply function on coordinate pair along particular axis using multiple variables in Xarray
[英]Using xarray to change coordinate system in order to Slice operation
我剛來這地方。 首先,我非常感謝您的時間和考慮。 關於在python中管理2個不同的netcdf文件,我有2個問題。 我搜索了很多但不幸的是我找不到解決方案。
1-我有一個netcdf文件,其坐標如下:
time datetime64[ns] 2016-08-16T22:00:00
* y (y) int32 220000 ... 620000
* x (x) int32 20000 ... 720000
lat (y, x) float64 dask.array<shape=(401, 701),
lon (y, x) float64 dask.array<shape=(401, 701),
我需要將coords更改為lon / lat,以便我可以根據特定的lon / lat坐標切片區域(通過使用xarray)。 但我不知道如何將x和y改為lon lat。 我的代碼:
import xarray as xr
import matplotlib.pyplot as plt
p = "R_201608.nc"
ds = xr.open_mfdataset(p)
q=ds.RR.sel(time='2016-08-16T21:00:00')
2-與1類似,我有另一個netcdf文件,其坐標如下:
* X (X) float32 557600.0 .. 579400.0
* Y (Y) float32 5190600 ... 5205400.0
* time (time) datetime64[ns] 2007-01I
如何將x和y轉換為lon / lat系統,以便我可以在lon / lat系統中繪制它?
編輯與@Ryan相關: 1-是。 這個文件可以在很大范圍內降雨。 我想將它切割成更小的區域 - 與q2-相關的文件的相似區域,並使用偏差,RMSE等比較它們。這里是與此文件相關的完整信息:
<xarray.Dataset>
Dimensions: (time: 2976, x: 701, y: 401)
Coordinates:
* time (time) datetime64[ns] 2016-08-31T23:45:00
* y (y) int32 220000 221000 ... 619000 620000
* x (x) int32 20000 21000 ... 719000 720000
lat (y, x) float64 dask.array<shape=(401, 701),chunksize=(401, 701)>
lon (y, x) float64 dask.array<shape=(401, 701), chunksize=(401, 701)
Data variables:
RR (time, y, x) float32 dask.array<shape=(2976, 401, 701), chunksize=(2976, 401, 701)>
lambert_conformal_conic int32 ...
Conventions: CF-1.5
與@Ryan相關的編輯:2-這里是關於第二個文件(較小區域)的完整信息:
<xarray.DataArray 'Precip' (time: 8928, Y: 75, X: 110)>
dask.array<shape=(8928, 75, 110), dtype=float32, chunksize=(288, 75, 110)>
Coordinates:
sensor_height_precip float32 1.5
sensor_height_P float32 1.5
* X (X) float32 557600.0 557800.0 ... 579200.0 579400.0
* Y (Y) float32 5190600.0 5190800.0 ... 5205400.0
* time (time) datetime64[ns] 2007-01-31T23:55:00
Attributes:
grid_mapping: UTM33N
ancillary_variables: QFlag_Precip QGrid_Precip
long_name: Precipitation Amount
standard_name: precipitation_amount
cell_methods: time:sum
units: mm
在問題1)中,不可能將lon和lat轉換為維度坐標,因為它們是二維的(都具有維度x,y)。 用於切片的尺寸坐標只能是一維的。 如果您可以更加具體地了解切片后您想要做什么,我們可以提供更多有關如何進行的建議。 是否要選擇特定的緯度/經度范圍,然后計算一些統計數據(例如均值/方差)?
問題2)看起來你有一個地圖投影。 如果沒有關於投影的更多信息,則無法轉換為緯度/經度坐標或在地圖上繪圖。 您的數據集中是否包含有關所使用的地圖投影的更多信息? 你能發布print(ds)
的完整輸出嗎?
我幫你解決了問題。 非常感謝。 我可以使用PYPROJ將兩個數據集的坐標更改為lon / lat,如@Bart所述。 從原始坐標和投影坐標創建meshgid是關鍵點。
from pyproj import Proj
nxv, nyv = np.meshgrid(nx, ny)
unausp = Proj('+proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs ')
nlons, nlats = unausp(nxv, nyv, inverse=True)
upLon, upLat = np.meshgrid(nlons,nlats)
由於我想比較具有不同空間分辨率(不同網格大小)的兩個降雨數據集,我必須使用xarray插值來升級其中一個:
upnew_lon = np.linspace(w.X[0], w.X[-1], w.dims['X'] // 5)
upnew_lat = np.linspace(w.Y[0], w.Y[-1], w.dims['Y'] //5)
uppds = w.interp(Y=upnew_lat, X=upnew_lon)
據我所知,這種插值是基於線性插值的。 我將放大的數據集與原始數據集進行了比較。 升級后降雨量平均減少約0.03毫米/天。 我只是想知道你認為這種小時降雨的升級方法是否可靠?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.