簡體   English   中英

使用 python 替換 netCDF 文件中的值

[英]Replace values in netCDF file using python

我想替換下面所有的 -999.0 值。 netCDF 文件由 0.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 值均未替換。 如何解決這個問題?

您以追加模式 ( 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

變量的文件內容兩種方式都相同,但不同的是后一種命令還會更改元數據以將零標識為“缺失值”。 這意味着在 ncview 等軟件中,0 被正確識別為缺失。 但是,請注意,現在缺少任何零發生率,包括原始文件中已經存在的發生率!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM