Python中创建NetCDF文件时如何指定维度值?
How to Specify Dimension Values when Creating NetCDF File in Python?
我正在创建一个 NetCDF4 文件,该文件目前有四个变量:
1) 地表温度(3D 数组 - 时间、纬度、经度)
2) 经度(1D - 每个像素中心的坐标)
3) 纬度(一维 - 每个像素中心的坐标)
4) 时间(自 1900 年 1 月 1 日以来以小时为单位的图像采集时间 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 设置为与我已包含在以上代码。 因此我想了解如何为文件中的每个波段更改此设置?
问题更新:当我对文件(同样是一个子集)执行 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 元数据设置为 'time' 变量。我已经更新了我的问题以询问如何执行此操作。
与维度关联的变量应与维度同名。因此,在上面的代码中,将创建变量行替换为:
TIMEs = newfile.createVariable('time', np.int32, ('time',))
现在 gdalinfo 知道在哪里可以找到数据。我 运行 你的代码使用虚拟时间 [1000000, 1000024] 和 gdal 信息 returns:
Band1...
...
NETCDF_DIM_time=1000000
...
Band2...
...
NETCDF_DIM_time=1000024
...
回答您的标题问题:您不能为维度赋值,但您可以拥有一个与维度同名的变量,该变量保存与维度关联的 data/values。 netcdf 文件的读者,如 gdal,寻找这样的约定来解释数据。例如参见 [=12=]
我正在创建一个 NetCDF4 文件,该文件目前有四个变量:
1) 地表温度(3D 数组 - 时间、纬度、经度)
2) 经度(1D - 每个像素中心的坐标)
3) 纬度(一维 - 每个像素中心的坐标)
4) 时间(自 1900 年 1 月 1 日以来以小时为单位的图像采集时间 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 设置为与我已包含在以上代码。 因此我想了解如何为文件中的每个波段更改此设置?
问题更新:当我对文件(同样是一个子集)执行 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 元数据设置为 'time' 变量。我已经更新了我的问题以询问如何执行此操作。
与维度关联的变量应与维度同名。因此,在上面的代码中,将创建变量行替换为:
TIMEs = newfile.createVariable('time', np.int32, ('time',))
现在 gdalinfo 知道在哪里可以找到数据。我 运行 你的代码使用虚拟时间 [1000000, 1000024] 和 gdal 信息 returns:
Band1...
...
NETCDF_DIM_time=1000000
...
Band2...
...
NETCDF_DIM_time=1000024
...
回答您的标题问题:您不能为维度赋值,但您可以拥有一个与维度同名的变量,该变量保存与维度关联的 data/values。 netcdf 文件的读者,如 gdal,寻找这样的约定来解释数据。例如参见 [=12=]