Заменить значения в файле netCDF, используя python

Я хотел бы заменить все значения -999.0 в следующих. Файл netCDF на 0.0. Файл находится здесь: https://www.dropbox.com/s/ohh7tntzm2pj1uw/all_SSP3_BaU_NoCC.nc?dl=0

вот моя функция:

def modify_nc_value(path_inp, name_var, val_to_modify, new_value):
    """
    Replace value in netCDF vriable from val_to_modify to new_value
    Args:
        path_inp:
        name_var: Name of variable for which to modify value, if -1, then change all variables
        val_to_modify:
        new_value:

    Returns:

    """
    hndl_inp = netCDF4.Dataset(path_inp, 'r+')

    if name_var == -1:
        for var, varin in hndl_inp.variables.iteritems():
            hndl_inp[var][:][hndl_inp[var][:] == val_to_modify] = new_value
    else:
        hndl_inp[name_var][:][hndl_inp[name_var][:] == val_to_modify] = new_value

    hndl_inp.close()  # Write variable back to disk

Однако эта функция, похоже, не работает. Ни одно из значений -999.0 не заменяется. Как это исправить?

1 ответ

Решение

Вы открыли файл в режиме добавления (r+), что позволит только добавлять новые значения. Там действительно нет режима чтения / записи, потому что наборы данных быстро растут огромными. У вас есть два варианта:

  • Прочитайте набор данных, откройте новый файл (режим w, clobber - True), напишите в него с изменениями, скопируйте его обратно в исходный набор данных.

  • Если набор данных большой, то есть> 5T или около того, вы действительно хотите изменить свой код, чтобы вместо него искать значения -999.0.

  • Там может быть способ сделать это. Я никогда не делал эти намеки, но вам может повезти.

Удачи! Если вы заставите это работать, добавьте это к этим ответам.

Если вы готовы рассмотреть возможность выполнения этой задачи из командной строки, это легко сделать с помощью операторов климатических данных (CDO).

Вы можете определить маску с 0, где исходное поле имеет -999, а затем умножить эту маску на исходное поле.

cdo nec,-999.0 file.nc mask.nc
cdo mul file.nc mask.nc new_file.nc 

или соединены вместе

cdo mul file.nc -nec,-999.0 file.nc new_file.nc 

Однако я предполагаю, что -999,0 на самом деле является "отсутствующим значением" для поля, указанного в метаданных. В этом случае вы также можете добиться этого, используя

cdo setmissval,0 file.nc new_file.nc

Содержимое файла переменной идентично в обоих направлениях, но разница в том, что последняя команда также изменит метаданные, чтобы идентифицировать ноль как "отсутствующее значение". Это означает, что 0 правильно определен как отсутствующий в программном обеспечении, таком как ncview. Однако обратите внимание, что теперь отсутствуют любые нулевые значения, включая те, которые уже были в исходном файле!

Другие вопросы по тегам