重网格化.nc文件时xarray cubic插值返回NaN值问题求助
问题描述
我正在为随机森林模型处理.nc文件,需要用xarray.interp将0.05度分辨率的数据重网格化到0.25度以提升分辨率。目前linear和slinear插值可正常工作,但尝试cubic插值时返回全NaN值。起初怀疑是y(纬度)未按升序排列,调整后问题仍存在。
复现代码
import netCDF4 import xarray as xr import numpy as np import pandas as pd file_path_nc ="Combined_Day_LST.nc" dataset = xr.open_dataset(file_path_nc) regrid_lat = np.arange(21.125,31.875,0.25) regrid_lon = np.arange(76.125,91.875,0.25) data_array = dataset.interp(y = regrid_lat,x=regrid_lon,method='cubic') for variable in data_array.variables: print(variable) which = 'LST' var = data_array.metpy.parse_cf(which) values = var.isel(time=0) lons = data_array.metpy.parse_cf('x') lats = data_array.metpy.parse_cf('y') df = pd.DataFrame(data=values.values)
解决方案
1. 检查原始数据的完整性与坐标单调性
cubic插值对数据连续性要求远高于线性插值,若原始数据存在缺失值或坐标非严格单调,会直接导致插值失败:
- 检查原始数据的缺失值情况:
print(dataset['LST'].isnull().sum()) - 验证坐标是否严格单调递增:
若存在非单调情况,可先对数据集排序:print(np.all(np.diff(dataset['y']) > 0)) # 检查纬度升序 print(np.all(np.diff(dataset['x']) > 0)) # 检查经度升序dataset = dataset.sortby(['y', 'x'])
2. 调整插值的边界处理逻辑
xarray默认的边界处理无法适配cubic插值的需求,可尝试两种方式:
- 允许边界外插:
data_array = dataset.interp(y=regrid_lat, x=regrid_lon, method='cubic', fill_value="extrapolate") - 裁剪重网格范围,确保完全落在原始数据范围内:
先查看原始数据的坐标极值:
再调整print(f"原始纬度范围: {dataset['y'].min():.3f} ~ {dataset['y'].max():.3f}") print(f"原始经度范围: {dataset['x'].min():.3f} ~ {dataset['x'].max():.3f}")regrid_lat和regrid_lon的起止值,避免超出原始范围。
3. 改用Scipy的griddata实现cubic插值
若xarray原生interp仍无法解决,可结合scipy的griddata手动实现:
from scipy.interpolate import griddata # 提取原始数据的坐标与数值 original_lon = dataset['x'].values.flatten() original_lat = dataset['y'].values.flatten() original_lst = dataset['LST'].values.flatten() # 创建重网格的坐标网格 grid_lon, grid_lat = np.meshgrid(regrid_lon, regrid_lat) # 执行cubic插值 interpolated_lst = griddata((original_lon, original_lat), original_lst, (grid_lon, grid_lat), method='cubic') # 转换为xarray数据集 regridded_ds = xr.Dataset( {'LST': (['y', 'x', 'time'], interpolated_lst[..., np.newaxis])}, coords={ 'y': regrid_lat, 'x': regrid_lon, 'time': dataset['time'].values } )
内容的提问来源于stack exchange,提问作者Ashish Ganesh
相关产品推荐
相关产品推荐

