我想对griddata (= xarray,尺寸:lat,lon, time)进行时间线性插值,这意味着我有一个时间步长,其中没有数据,但之前和之后的时间步长有信息。我尝试使用scipy.interpolate.griddata,在那里我首先为所有nan数据创建了一个掩码层,然后用那里的数据插值nan。
数据仿真:
[0.47942554, 0.48971277, 0.47942554, 0.98971277, 1.23971277],
[0.2171174 , 0.4671174 , 0.7171174 , 0.9671174 , 1.2171174 ],
[0.18102272, 0.43102272, 0.68102272, 0.93102272, 1.18102272],
[0.47942554, 0.38367293, 0.63367293, 0.88367293, 1.13367293]],
[[nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan]],
[[0.47942554, 0.47942554, 0.97942554, 1.22942554, 1.47942554],
[0.46452136, 0.71452136, 0.96452136, 1.21452136, 1.46452136],
[0.42073549, 0.67073549, 0.92073549, 1.17073549, 0.47942554],
[0.35079033, 0.60079033, 0.85079033, 1.10079033, 1.35079033],
[0.47942554, 0.50903472, 0.75903472, 0.47942554, 1.25903472]]])
我尝试过什么(在这个问题的帮助下:如何使用scipy.interpolate.interpn函数与xarray (3d),以填补nan空白?当前错误[维度0中的点必须严格升序排列]):
# ravel all points and find the valid ones
points = da.data.ravel()
valid = ~np.isnan(points)
points_valid = points[valid]
# construct arrays of (x, y, z) points, masked to only include the valid points
xx, yy, zz = np.meshgrid(x, y, z)
xx, yy, zz = xx.ravel(), yy.ravel(), zz.ravel()
xxv = xx[valid]
yyv = yy[valid]
zzv = zz[valid]
# feed these into the interpolator, and also provide the target grid
interpolated = scipy.interpolate.griddata(np.stack([xxv, yyv, zzv]).T, points_valid, (xx, yy, zz), method="linear")
# reshape to match the original array and replace the DataArray values with
# the interpolated data
da.values = interpolated.reshape(da.shape)
然而,在这种方法中,空间和时间插值之间没有区别,因为只使用最接近的值(也使用线性插值-然后只取下3个点)。问题是,由于某种原因,它总是使用空间上最近的点,而不是时间上的点。因此空间插值看起来很好,但是时间插值看起来很混乱。我想要的只是一个时间插值(没有空间邻居)。
我可以改变什么?请帮助!
xarray
有一些插值工具
下面的例子从文件位置fname
打开一个netCDF数据集,并在lon, lat和time上插入param1和param2。
with xr.open_dataset(fname) as ds:
lat = xr.DataArray(your_lat_array, dims='z')
lon = xr.DataArray(your_lon_array, dims='z')
time_array = xr.DataArray(your_time_array, dims='z')
interp_results = ds.interp(lat=lat,lon=lon,time=time_array)
df['param1'] = interp_results['param1'].values
df['param2'] = interp_results['param2'].values
我不能准确地告诉你的代码看起来像假人,但我相信上面的代码可以引导你找到正确的答案。有关interp的更多详细信息,请参阅此处的xarray文档。它继承自scipy.interp