Access variables in nested group in netcdf file (file format HDF5)

1.2k Views Asked by At

I'm trying, without success, to access the object 'latitude' in a NETCDF4_CLASSIC file, with python and the netcdf4 library. When I open the file:

ncFile = '/path/to/file.nc4'
f = netCDF4.Dataset(ncFile, 'r')
f 

I get this structure:

NETCDF4_CLASSIC
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4_CLASSIC data model, file format HDF5):
    StructMetadata_0: GROUP=SwathStructure
    GROUP=SWATH_1
        SwathName="2B-CLDCLASS"
        GROUP=Dimension
            OBJECT=Dimension_1
                DimensionName="nray"
                Size=37081
            END_OBJECT=Dimension_1
            OBJECT=Dimension_2
                DimensionName="scalar"
                Size=1
            END_OBJECT=Dimension_2
            OBJECT=Dimension_3
                DimensionName="nbin"
                Size=125
            END_OBJECT=Dimension_3
            OBJECT=Dimension_4
                DimensionName="Ncloud"
                Size=10
            END_OBJECT=Dimension_4
        END_GROUP=Dimension
        GROUP=DimensionMap
        END_GROUP=DimensionMap
        GROUP=IndexDimensionMap
        END_GROUP=IndexDimensionMap
        GROUP=GeoField
            OBJECT=GeoField_1
                GeoFieldName="Profile_time"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=GeoField_1
            OBJECT=GeoField_2
                GeoFieldName="UTC_start"
                DataType=DFNT_FLOAT32
                DimList=("scalar")
            END_OBJECT=GeoField_2
            OBJECT=GeoField_3
                GeoFieldName="TAI_start"
                DataType=DFNT_FLOAT64
                DimList=("scalar")
            END_OBJECT=GeoField_3
            OBJECT=GeoField_4
                GeoFieldName="Latitude"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=GeoField_4
            OBJECT=GeoField_5
                GeoFieldName="Longitude"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=GeoField_5
            OBJECT=GeoField_6
                GeoFieldName="Height"
                DataType=DFNT_INT16
                DimList=("nray","nbin")
            END_OBJECT=GeoField_6
            OBJECT=GeoField_7
                GeoFieldName="Range_to_intercept"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=GeoField_7
            OBJECT=GeoField_8
                GeoFieldName="DEM_elevation"
                DataType=DFNT_INT16
                DimList=("nray")
            END_OBJECT=GeoField_8
            OBJECT=GeoField_9
                GeoFieldName="Vertical_binsize"
                DataType=DFNT_FLOAT32
                DimList=("scalar")
            END_OBJECT=GeoField_9
            OBJECT=GeoField_10
                GeoFieldName="Pitch_offset"
                DataType=DFNT_FLOAT32
                DimList=("scalar")
            END_OBJECT=GeoField_10
            OBJECT=GeoField_11
                GeoFieldName="Roll_offset"
                DataType=DFNT_FLOAT32
                DimList=("scalar")
            END_OBJECT=GeoField_11
        END_GROUP=GeoField
        GROUP=DataField
            OBJECT=DataField_1
                DataFieldName="Data_quality"
                DataType=DFNT_UINT8
                DimList=("nray")
            END_OBJECT=DataField_1
            OBJECT=DataField_2
                DataFieldName="Data_status"
                DataType=DFNT_UINT16
                DimList=("nray")
            END_OBJECT=DataField_2
            OBJECT=DataField_3
                DataFieldName="Data_targetID"
                DataType=DFNT_UINT8
                DimList=("nray")
            END_OBJECT=DataField_3
            OBJECT=DataField_4
                DataFieldName="RayStatus_validity"
                DataType=DFNT_UINT8
                DimList=("nray")
            END_OBJECT=DataField_4
            OBJECT=DataField_5
                DataFieldName="Navigation_land_sea_flag"
                DataType=DFNT_UINT8
                DimList=("nray")
            END_OBJECT=DataField_5
            OBJECT=DataField_6
                DataFieldName="Precip_flag"
                DataType=DFNT_INT8
                DimList=("nray")
            END_OBJECT=DataField_6
            OBJECT=DataField_7
                DataFieldName="SST"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=DataField_7
            OBJECT=DataField_8
                DataFieldName="Surface_wind"
                DataType=DFNT_FLOAT32
                DimList=("nray")
            END_OBJECT=DataField_8
            OBJECT=DataField_9
                DataFieldName="cloud_scenario"
                DataType=DFNT_INT16
                DimList=("nray","nbin")
                CompressionType=HDFE_COMP_DEFLATE
                DeflateLevel=4
            END_OBJECT=DataField_9
            OBJECT=DataField_10
                DataFieldName="CloudLayer"
                DataType=DFNT_INT16
                DimList=("nray")
            END_OBJECT=DataField_10
            OBJECT=DataField_11
                DataFieldName="CloudLayerBase"
                DataType=DFNT_FLOAT32
                DimList=("nray","Ncloud")
                CompressionType=HDFE_COMP_DEFLATE
                DeflateLevel=4
            END_OBJECT=DataField_11
            OBJECT=DataField_12
                DataFieldName="CloudLayerTop"
                DataType=DFNT_FLOAT32
                DimList=("nray","Ncloud")
                CompressionType=HDFE_COMP_DEFLATE
                DeflateLevel=4
            END_OBJECT=DataField_12
            OBJECT=DataField_13
                DataFieldName="CloudLayerType"
                DataType=DFNT_INT16
                DimList=("nray","Ncloud")
                CompressionType=HDFE_COMP_DEFLATE
                DeflateLevel=4
            END_OBJECT=DataField_13
        END_GROUP=DataField
        GROUP=MergedFields
        END_GROUP=MergedFields
    END_GROUP=SWATH_1
END_GROUP=SwathStructure
GROUP=GridStructure
END_GROUP=GridStructure
GROUP=PointStructure
END_GROUP=PointStructure
END
    HDFEOSVersion: HDFEOS_V2.5
    creation_date: Wed Feb 17 03:59:37 UTC 2021
    NCL_Version: 6.6.2
    system: Linux 0fc9309f2c2a 4.19.112+ #1 SMP Thu Jul 23 08:00:38 PDT 2020 x86_64 x86_64 x86_64 GNU/Linux
    Conventions: None
    hdf_source: 2010017014344_19801_CS_2B-CLDCLASS_GRANULE_P1_R05_E03_F00.hdf
    title: NCL: convert-HDF-to-netCDF
    dimensions(sizes): nray_2B_CLDCLASS(37081), nbin_2B_CLDCLASS(125), Ncloud_2B_CLDCLASS(10)
    variables(dimensions): int16 Height(nray_2B_CLDCLASS, nbin_2B_CLDCLASS), int16 cloud_scenario(nray_2B_CLDCLASS, nbin_2B_CLDCLASS), float32 CloudLayerBase(nray_2B_CLDCLASS, Ncloud_2B_CLDCLASS), float32 CloudLayerTop(nray_2B_CLDCLASS, Ncloud_2B_CLDCLASS), int16 CloudLayerType(nray_2B_CLDCLASS, Ncloud_2B_CLDCLASS)
    groups: 

I've tried this and didn't worked. Also when I tried to retrive the variables keys with f.variables.keys() I got

odict_keys(['Height', 'cloud_scenario', 'CloudLayerBase', 'CloudLayerTop', 'CloudLayerType'])

It seems like 'Height' is a variables and 'Latitude' is not, even though they're in the same GROUP. I also tried f.groups and the output is just OrderedDict().

The file is Cloudsat CLDCLASS.hdf converted to .nc through NCL (convert2nc).

Any hint will be very appreciated. I'm new in the NetCDF world.

1

There are 1 best solutions below

1
On
dt = netCDF4.Dataset(file_names,'r')
variable = dt.groups['group_name'].variables['variable_name']

(see also https://www.codegrepper.com/code-examples/python/python+nc+group+variables)