我想知道如何在循环中读取包含不同组的 nc 文件,我尝试使用 xarray.open_datasets 但它返回一个空文件。可能是因为变量存储在组中?我附上了我的示例 .nc 文件,我有大约 300 个这样的 nc 文件,从每个文件中,我需要在所有组下取一个变量并存储在 csv 文件中。
我试过了,但它给出了一个空数组。
我尝试使用 xr.open_dataset 打开 nc 文件,但它返回空文件,可能该 nc 文件中的每个组中都有数据
dirname='C:/Data1'
lst = []
for k in os.listdir(dirname):
if k.endswith('.nc'):
lst.append(k)
lst.sort()
print (lst)
for i in lst:
data = xr.open_dataset(os.path.join(dirname, i),engine='netcdf4')
print(data)
您的文件可能在根级别没有任何变量,但可能包含具有嵌套层次结构中变量的组。
xarray 不能用于打开多组层次结构或列出 netCDF 文件中的组,但如果您知道它的路径,它可以打开特定组。
要列出文件中的组,首先直接用
netcdf4
库打开文件。请参阅netCDF4 文档。具体来说,.groups
对象上的 netCDF4.Dataset
属性包含给出组名和 netCDF4.Group
对象的键值对:
>>> from netCDF4 import Dataset
>>> rootgrp = Dataset("test.nc", "r")
>>> print(rootgrp.groups)
{'forecasts': <class 'netCDF4.Group'>
group /forecasts:
dimensions(sizes):
variables(dimensions):
groups: , 'analyses': <class 'netCDF4.Group'>
group /analyses:
dimensions(sizes):
variables(dimensions):
groups: }
请注意,这些组本身可以有组,因此您可能需要递归探索层次结构以找到所有变量。上面链接的文档包含一个示例,说明您如何执行此操作:
>>> def walktree(top):
... yield top.groups.values()
... for value in top.groups.values():
... yield from walktree(value)
>>> for children in walktree(rootgrp):
... for child in children:
... print(child)
<class 'netCDF4.Group'>
group /forecasts:
dimensions(sizes):
variables(dimensions):
groups: model1, model2
<class 'netCDF4.Group'>
group /analyses:
dimensions(sizes):
variables(dimensions):
groups:
<class 'netCDF4.Group'>
group /forecasts/model1:
dimensions(sizes):
variables(dimensions):
groups:
<class 'netCDF4.Group'>
group /forecasts/model2:
dimensions(sizes):
variables(dimensions):
groups:
一旦有了组路径,就可以通过传递 xr.open_dataset
关键字参数,使用
group
读取组,例如:
ds = xr.open_dataset(
"test.nc", group="/forecasts/model2"
)
有关读取和写入数据的 xarray 文档:netCDF 了解更多信息和示例。
xr.open_mfdataset
以从多个文件中打开同一个组。
xarray-datatree
python 包尝试原型实现。