关于xarray无法提取nc文件的变量数据,出现NetCDF: HDF error的解决方案
一、问题描述:
我在Anaconda Spyder中写入下述几行简单的代码,读取NC文件中的变量,运行成功;但是当我进一步提取变量信息时,却出现NetCDF: HDF error的报错。
#### 环境声明
# Windows 10
# Python 3.9.13
########################
# xarray version==0.17.0
# netCDF4 version==1.5.8
# hdf5 version==1.10.6
import xarray as xr # xarray version==0.17.0
import netCDF4 as nc # netCDF4 version==1.5.8
import hdf5
da = xr.open_dataset('F:/modis_chla.nc') # 2003-2022 monthly资料
chl = da['chlor_a'] # chl[Time=300|Lon=960|Lat=1200]
# =========以下会报错
chl[0,:,:].plot()
# 甚至当我只想读出一个格点的数据时,也会出错
print (chl[0,0,0])
二、网上查询解决方法
1. 文件路径问题
https:// blog.csdn.net/kyzy_0018 127/article/details/116714753
文中提到文件的路径有中文字符,读取出现解析问题。
但事实上文件解析过程没有问题,变量 da 和 chl 都可以print,只是数据无法提取。
2. netCDF4版本问题
https:// blog.csdn.net/qq_393522 01/article/details/113665368
文中认为netCDF4版本有问题,将netCDF4 version==1.5.5.1降为netCDF4 version==1.4.0之后,问题得到了解决。
我并没有这样做,因为Python3.9无法兼容netCDF4 version==1.4.0,难以评定。
3. h5py包
https:// github.com/Unidata/netc df4-python/issues/653
文中提出解决方案,但是我没有成功,而且这种import顺序应该并没有任何影响
## 调换h5py和netCDF4 的import顺序
import h5py
import netCDF4
文中还提到可能的原因来自HDF5 c library,但没有解决方法。
4. HDF5的问题
https://www. likecs.com/ask-594179.h tml
文中认为是HDF5的版本问题,需要改变文件系统读写,代码如下
import os
os.HDF5_USE_FILE_LOCKING=FALSE
但是并无用处。。。
三、最根本的解决方案
在读取nc文件之后,不要急着读取变量信息,写入以下代码
import netCDF4 as nc
with nc.Dataset('F:/modis_chla.nc') as f:
# chlor_a是f文件中的某个变量variables
f['chlor_a'].set_collective(True) # chl[Time=300|Lon=960|Lat=1200]
而且,不论是用xarray还是netCDF4去读取变量,碰到文中报错都可以写这两行代码,例如:
import netCDF4 as nc