Как указать значения измерения при создании файла NetCDF в Python?

Я создаю файл NetCDF4, который в настоящее время имеет четыре переменные:

1) Температура поверхности земли (трехмерный массив - время, широта, долгота)

2) Долгота (1D - координата центра каждого пикселя)

3) Широта (1D - координата центра каждого пикселя)

4) Время (время получения изображения в часах с 01.01.1900 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 полосы (по одной на каждый час дня). Этот код работает так, как я хотел, хотя есть одна небольшая проблема, которую я хочу решить. Когда я запускаю gdalinfo для переменной LST, я получаю (это сокращенная версия):

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

Я хочу, чтобы это значение 1 было установлено таким же, как переменная «время» (что-то вроде 1081451 часов с 1900-01-01 00:00:00), которую я включил в свой код выше. Поэтому я хочу понять, как это можно изменить для каждой полосы в файле?

ОБНОВЛЕНИЕ ВОПРОСА: когда я выполняю gdalinfo для файла (опять же, подмножество):

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

но отсутствует параметр «NETCDF_DIM_time_VALUES», и мне нужно установить его на переменную времени, и это должно работать. КАК ЭТО СДЕЛАТЬ?

В настоящее время он просто устанавливается на номер диапазона, но я хочу, чтобы он содержал информацию о часе его приобретения.

ОБНОВЛЕНИЕ 1:

Я попытался указать

LSTs.NETCDF_DIM_Time = time

во время формирования файла netCDF, и это присвоило все значения времени NETCDF_DIM_TIME в gdal, так что каждый диапазон имеет 24 значения времени, а не только одно.

ОБНОВЛЕНИЕ 2:

При дальнейшем копании я думаю, что это метаданные NETCDF_DIM_time_VALUES, которые необходимо установить в переменную «время». Я обновил свой вопрос, чтобы спросить, как это сделать.


person tda    schedule 24.01.2017    source источник


Ответы (1)


Переменные, связанные с измерениями, должны иметь то же имя, что и измерения. Итак, в приведенном выше коде замените строку создания переменной на:

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: лучшие практики" "Координация системы

person Colabean    schedule 15.03.2017