You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重网格化.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:01:01