使用xarray处理NetCDF文件时出现随机错误求助
批量读取NetCDF气象数据的随机错误排查与解决
示例代码
import xarray as xr import numpy as np import matplotlib.pyplot as plt from skimage.measure import block_reduce # 批量读取NetCDF文件 data = xr.open_mfdataset("filepath\*.nc", parallel=True) # 提取变量转numpy数组 tas = np.array(data['tas']) time = np.array(data['time']) x = np.array(data['projection_x_coordinate']) y = np.array(data['projection_y_coordinate']) lat = np.array(data['latitude']) lon = np.array(data['longitude']) # 时间维度降采样(按年平均) temp = block_reduce(tas, block_size=(12,1,1), func=np.mean, cval=np.mean(tas)) time = np.arange(1884,2023) # 绘图 plt.plot(time, temp[:, 23, 62], 'r', label='London') plt.plot(time, temp[:, 22, 55], 'c', label='Headley') plt.plot(time, temp[:, 23, 59], 'g', label='Egham') plt.legend() plt.xlabel('Time (1884-2022)') plt.ylabel('Temperature [C]') plt.title('Heat Island Effect for Average Monthly Temperature')
问题现象
- 运行结果随机:有时能正常出图,有时抛出以下错误:
OSError: [Errno -51] NetCDF: Unknown file format: b'C:filepath\\tas_hadukgrid_uk_12km_mon_197201-197212.nc' RuntimeError: NetCDF: Not a valid ID KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('C:filepath\\tas_hadukgrid_uk_12km_mon_197401-197412.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), '621f2ad1-8dca-4c52-83d3-1f7fe6b4972d']
- 伴随无关警告:
C:\Users\miniconda3\envs\spyder-env\Lib\site-packages\paramiko\transport.py:219: CryptographyDeprecationWarning: Blowfish has been deprecated "class": algorithms.Blowfish,
- 内核会自动重启,且问题在Spyder、Jupyter、VSCode中均存在,重装conda环境、重置电脑无法解决。
解决方案
1. 验证NetCDF文件完整性与格式
- 用
ncdump -h 文件名.nc命令检查报错文件的格式,确认是标准NetCDF3/4格式,无文件损坏。 - 单独用
xr.open_dataset("报错文件名.nc")测试,若单个文件稳定报错,说明文件本身存在问题,需重新获取或修复。
2. 调整open_mfdataset参数
- 关闭并行读取:Windows环境下并行读取易触发文件IO冲突,先去掉
parallel=True测试:data = xr.open_mfdataset("filepath/*.nc") - 指定读取引擎:避免自动格式检测出错,手动指定引擎:
data = xr.open_mfdataset("filepath/*.nc", engine='netcdf4') # 或engine='h5netcdf' - 明确拼接维度:指定
concat_dim='time'减少自动拼接的歧义:data = xr.open_mfdataset("filepath/*.nc", concat_dim='time', combine='nested')
3. 修复文件路径问题
Windows路径的反斜杠易触发转义问题,改用正斜杠或原始字符串:
# 正斜杠 data = xr.open_mfdataset("filepath/*.nc", parallel=True) # 或原始字符串 data = xr.open_mfdataset(r"filepath\*.nc", parallel=True)
4. 消除paramiko警告(可选)
更新paramiko到最新版本,或在代码开头添加警告过滤:
import warnings warnings.filterwarnings("ignore", category=DeprecationWarning, module="paramiko")
5. 优化数据处理流程(减少内存占用)
避免直接转numpy数组,用xarray内置方法处理,降低IO和内存压力:
import xarray as xr import matplotlib.pyplot as plt # 分块读取+指定引擎 data = xr.open_mfdataset("filepath/*.nc", engine='netcdf4', chunks={'time':12}) # 用xarray内置resample实现按年平均,无需转numpy temp = data['tas'].resample(time='Y').mean(dim='time') # 直接提取年份,无需手动生成time数组 time = temp.time.dt.year.values # 直接用xarray数据绘图 plt.plot(time, temp.isel(projection_x_coordinate=62, projection_y_coordinate=23), 'r', label='London') plt.plot(time, temp.isel(projection_x_coordinate=55, projection_y_coordinate=22), 'c', label='Headley') plt.plot(time, temp.isel(projection_x_coordinate=59, projection_y_coordinate=23), 'g', label='Egham') plt.legend() plt.xlabel('Time (1884-2022)') plt.ylabel('Temperature [C]') plt.title('Heat Island Effect for Average Monthly Temperature')
内容的提问来源于stack exchange,提问作者jimmymac
相关产品推荐
相关产品推荐

