具有不同组的 NC 文件 - 需要从所有组中提取选定的一个变量

问题描述 投票:0回答:1

我想知道如何在循环中读取包含不同组的 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)
python netcdf python-xarray
1个回答
0
投票

您的文件可能在根级别没有任何变量,但可能包含具有嵌套层次结构中变量的组。

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 包尝试原型实现。

© www.soinside.com 2019 - 2024. All rights reserved.