使用xarray创建NetCDF文件时lat维度尺寸冲突问题求助
问题分析与解决
报错原因
ValueError: 维度'lat'的尺寸冲突:'lat'的长度为1626,而{'lat': 'doc', 'lon': 'doc'}上的长度为1的核心问题在于:
- 你定义的
lat和lon坐标长度为1626,但在设置doc变量时,指定了二维维度('lat','lon'),同时传入的[col_doc]是一个仅包含1个元素的列表(该元素是长度1626的列表),导致xarray判定doc的lat维度长度为1,与坐标的1626产生冲突。 - 你的数据是一维点数据(每个条目对应一组lat、lon、doc),并非二维网格数据(lat和lon构成二维网格,每个网格点对应一个doc值),因此不能用二维维度来定义变量。
修正方案
方案1:用单一维度关联所有数据(适配点数据场景)
将所有数据绑定到一个共享维度(比如'points'),确保每个点的lat、lon、doc一一对应:
import pandas as pd import xarray as xr df = pd.read_excel("./data/example.xlsx", keep_default_na=False) # 直接过滤空值行,比单独处理列更高效,避免各列长度不一致 df_filtered = df[ (df['mission'] != '') & (df['jour'] != '') & (df['heure'] != '') & (df['lat'] != '') & (df['lon'] != '') & (df['doc'] != '') ] # 创建Dataset,用points作为共享维度关联所有字段 ds = xr.Dataset( coords={ 'lat': ('points', df_filtered['lat'].tolist()), 'lon': ('points', df_filtered['lon'].tolist()), 'mission': ('points', df_filtered['mission'].tolist()), 'jour': ('points', df_filtered['jour'].tolist()), 'heure': ('points', df_filtered['heure'].tolist()) }, data_vars={ 'doc': ('points', df_filtered['doc'].tolist()) } ) # 保存为NetCDF文件 ds.to_netcdf('./data/example.nc')
方案2:转换为二维网格数据(仅当数据是网格点时使用)
如果你的数据确实是二维网格结构(lat为N个唯一值,lon为M个唯一值,doc对应N*M的二维数组),需要先对lat和lon去重,再将doc整理为二维数组:
import pandas as pd import xarray as xr import numpy as np df = pd.read_excel("./data/example.xlsx", keep_default_na=False) df_filtered = df[(df['lat'] != '') & (df['lon'] != '') & (df['doc'] != '')] # 获取唯一的lat、lon值并排序 unique_lat = sorted(df_filtered['lat'].unique()) unique_lon = sorted(df_filtered['lon'].unique()) # 初始化二维网格数组,空值填充NaN doc_grid = np.full((len(unique_lat), len(unique_lon)), np.nan) # 建立lat、lon到索引的映射 lat_idx = {lat:i for i, lat in enumerate(unique_lat)} lon_idx = {lon:j for j, lon in enumerate(unique_lon)} # 填充网格数据 for _, row in df_filtered.iterrows(): i = lat_idx[row['lat']] j = lon_idx[row['lon']] doc_grid[i,j] = row['doc'] # 创建网格结构的Dataset ds = xr.Dataset( coords={ 'lat': unique_lat, 'lon': unique_lon }, data_vars={ 'doc': (('lat', 'lon'), doc_grid) } ) ds.to_netcdf('./data/example_grid.nc')
关键提示
- 优先选择方案1,你的示例数据中lat和lon存在重复值(如151.017出现两次),完全符合点数据的特征。
- 单独过滤每个列可能导致各列长度不一致,直接过滤DataFrame的行能确保所有字段长度匹配。
内容的提问来源于stack exchange,提问作者user21620824
相关产品推荐
相关产品推荐

