在Python中创建NetCDF文件时如何指定维度值?

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

我正在创建一个 NetCDF4 文件,当前有四个变量:

1) 地表温度(3D 数组 - 时间、纬度、经度)

2)经度(1D - 每个像素中心的坐标)

3)纬度(1D - 每个像素中心的坐标)

4) 时间(自 1900-01-01 00:00:00 起的图像采集时间,以小时为单位)

我目前正在使用以下代码来执行此操作:

    #==========================WRITE THE NETCDF FILE==========================#

    newfile = nc.Dataset(export_filename, 'w', format = 'NETCDF4_CLASSIC')


    #==========================SET FILE DIMENSIONS============================#

    newfile.createDimension('lat', ny)
    newfile.createDimension('lon', nx)
    newfile.createDimension('time', len(filenames))


    #==========================SET GLOBAL ATTRIBUTES==========================#

    newfile.title = ('Title')
    newfile.history = "File created on " + datetime.strftime(datetime.today(), "%c")
    newfile.Conventions = 'CF-1.6'



    #==========================CREATE DATA VARIABLES==========================#

    #--------------------------LST VARIABLE-----------------------------------#

    LSTs = newfile.createVariable('LST', np.int16, ('time', 'lat', 'lon'), fill_value = -8000)
    LSTs.units = 'Degrees C'
    LSTs.add_offset = 273.15
    LSTs.scale_factor = 0.01
    LSTs.standard_name = 'LST'
    LSTs.long_name = 'Land Surface Temperature'
    LSTs.grid_mapping = 'latitude_longitude'
    LSTs.coordinates = 'lon lat'

    LSTs[:] = LSTd[:]


    #--------------------------LON AND LAT AND TIME--------------------------#

    LONGITUDEs = newfile.createVariable('LONGITUDE', np.float64, ('lon',))
    LONGITUDEs.units = 'Decimal Degrees East'
    LONGITUDEs.standard_name = 'Longitude'
    LONGITUDEs.long_name = 'Longitude'
    LONGITUDEs[:] = LONd[:]

    LATITUDEs = newfile.createVariable('LATITUDE', np.float64, ('lat',))
    LATITUDEs.units = 'Decimal Degrees North'
    LATITUDEs.standard_name = 'Latitude'
    LATITUDEs.long_name = 'Latitude'
    LATITUDEs[:] = LATd[:]

    TIMEs = newfile.createVariable('TIME', np.int32, ('time',))
    TIMEs.units = 'hours since 1900-01-01 00:00:00'
    TIMEs.standard_name = 'Time'
    TIMEs.long_name = 'Time of Image Acquisition'
    TIMEs.axis = 'T'
    TIMEs.calendar = 'gregorian'
    TIMEs[:] = time[:]

    #--------------------------SAVE THE FILE---------------------------------#

    newfile.close();

此代码生成一个 netCDF 文件,其中陆地表面温度变量有 24 个波段(一天中的每个小时一个)。这段代码按照我想要的方式工作,尽管我希望解决一个小问题。当我为 LST 变量运行 gdalinfo 时,我得到(这是简化版本):

Band 1.....
...
NETCDF_DIM_TIME = 1
...

我希望将值 1 设置为与我在上面的代码中包含的“时间”变量(自 1900-01-01 00:00:00 以来的 1081451 小时)相同。 因此我想了解如何针对文件中的每个频段更改此设置?

更新问题:当我对文件(再次是一个子集)执行 gdalinfo 时:

NETCDF_DIM_EXTRA={time}
NETCDF_DIM_time_DEF={24,3}

但是有一个选项缺少“NETCDF_DIM_time_VALUES”,我需要将其设置为时间变量,它应该可以工作。 我该怎么做?

目前它只是被设置为波段编号,但我希望它包含有关其获取时间的信息。

更新1:

我已尝试指定

LSTs.NETCDF_DIM_Time = time

在 netCDF 文件形成期间,这已将所有时间值分配给 gdal 中的 NETCDF_DIM_TIME,以便每个频段都有 24 个时间值,而不是只有一个。

更新2:

经过进一步挖掘,我认为需要将 NETCDF_DIM_time_VALUES 元数据设置为“时间”变量。我已经更新了我的问题来询问如何做到这一点。

python gdal netcdf netcdf4
1个回答
4
投票

与维度关联的变量应与维度具有相同的名称。因此,在上面的代码中将创建变量行替换为:

TIMEs = newfile.createVariable('time', np.int32, ('time',))

现在 gdalinfo 知道在哪里可以找到数据。我使用虚拟时间 [1000000, 1000024] 运行了你的代码,并且 gdal 信息返回:

Band1...
...
NETCDF_DIM_time=1000000    
...
Band2...
...
NETCDF_DIM_time=1000024
...

回答您的标题问题:您无法为维度分配值,但您可以拥有一个与维度同名的变量,该变量保存与该维度关联的数据/值。 netcdf 文件的读者(例如 gdal)会寻找这样的约定来解释数据。例如,请参阅 Unidata 的“写入 NetCDF 文件:最佳实践”“坐标系”

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