2016-07-06 5 views
2

Ich möchte alle -999.0 Werte in den folgenden ersetzen. netCDF-Datei von 0.0. Die Datei ist hier: https://www.dropbox.com/s/ohh7tntzm2pj1uw/all_SSP3_BaU_NoCC.nc?dl=0Ersetzen Sie Werte in NetCDF-Datei mit Python

hier ist meine Funktion:

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 

Allerdings ist die Funktion nicht zu funktionieren scheint. Keiner der Werte von -999.0 wird ersetzt. Wie behebe ich das?

+0

Sind die Variablen immer 1D? Ich vermute nicht, aber dein Code weist 'var' immer 1D zu, d. H.' [Var] [:] '. – N1B4

+0

die Variablen sind 3D – user308827

+0

Sie müssen nicht wie in http://unidata.github.io/netcdf4-python/#netCDF4.Dataset.sync erwähnt synchronisieren –

Antwort

1

Sie haben die Datei im Append-Modus (r+) geöffnet, wodurch nur neue Werte hinzugefügt werden können. Es gibt wirklich keinen Lese-/Schreibmodus, da Daten schnell sehr groß werden. Sie haben zwei Möglichkeiten:

  • den Datensatz lesen, öffnen Sie eine neue Datei (Modus ist w, clobber Wahr ist), schreiben Sie mit Änderungen an, kopieren zurück über die ursprünglichen Daten-Set.

  • Wenn der Dataset groß ist, also> 5T oder so, möchten Sie den Code wirklich so ändern, dass er nach -999.0 Werten sucht.

  • Möglicherweise gibt es einen Weg, es zu tun. Ich habe nie gemacht these hints, aber Sie können mehr Glück haben.

Viel Glück! Wenn es funktioniert, füge es diesen Antworten hinzu.