2016-07-06 6 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.

Verwandte Themen