我有一个2d xarray数据集,我有几个nan值在数据集。这些nan值需要用2d数组中最近的非nan值填充。我怎么做呢?
我试图使我的数据与地球系统模型读取的grid_spec文件一致。强迫数据和grid_spec文件中的着陆点不一致导致模型爆炸。
江南体育网页版地球科学堆栈交换是一个为那些江南电子竞技平台对地质学、气象学、海洋学和环境科学感兴趣的人提供的问答网站。注册只需要一分钟。
注册加入这个社区吧我有一个2d xarray数据集,我有几个nan值在数据集。这些nan值需要用2d数组中最近的非nan值填充。我怎么做呢?
我试图使我的数据与地球系统模型读取的grid_spec文件一致。强迫数据和grid_spec文件中的着陆点不一致导致模型爆炸。
如果我是您,我会排除NaN值,然后对结果不规则间隔的数据执行网格化。
在Python和SciPy库中已经有了执行此操作的工具
https://scipy-cookbook.readthedocs.io/items/Matplotlib_Gridding_irregularly_spaced_data.html
但是请准确地记录你正在做的步骤和原因。排除数据总是……解读数据。
我可以用下面的函数来做
Def fill_mismatch(ds_grid_spec, ds_data): ds_data_o = ds_data.copy() count = 0.0 for I in range(ds_grid_spec.shape[0]): for j in range(ds_grid_spec.shape[1]): if ds_grid_spec[I,j]。值> 0.0和(not ds_data[i,j] > 0.0): count = count + 1.0 fill_miss2d(ds_data_o, i,j) if ds_grid_spec[i,j]。值== 0.0 and (not ds_data[i,j].)values == 0.0): count = count + 1.0 ds_data_o[i,j] = 0.0 return ds_data_o def fill_miss2d(ds, lat_i, lon_j): # fist cycle cycle = 1 while True: bl_i, bl_j = lat_i - cycle, lon_j - cycle tr_i, tr_j = lat_i + cycle, lon_j + cycle #左下i如果bl_i < 0: bl_i = 0 #左下j如果bl_j < 0: bl_j = 0 #右上i如果tr_i > ds.lat. cycle形状[0]-1:tr_i = ds.lat。shape[0]-1 #右上j if tr_j > ds.lon。形状[0]-1:tr_j = ds.lon。Shape [0]-1 lats_i = np.arange(bl_i,tr_i) lons_j = np.arange(bl_j,tr_j) for lats_i中的lats_i_idx: for lons_j中的lons_j_idx: if ds[lats_i_idx, lons_j_idx]>0.0: ds[lat_i, lon_j] = ds[lats_i_idx, lons_j_idx] return cycle = cycle + 1
grid_spec(模块化海洋模型MOM最常用的网格交换文件)有一个变量AREA_LND和文件soiltype。Nc土壤类型多变。这两个变量在划分为海洋的网格点上都有0.0。因此,我们不需要使用fill_miss2d,当不匹配发生时,在grid_spec中遇到海洋,但在soiltype中有陆地。相反,我们直接用0.0填充土壤类型网格点
完整的笔记本可以在https://github.com/manmeet3591/python_class/blob/master/xarray_tutorial/grid_soiltype.ipynb