2017-07-10 2 views
0

J'ai un fichier netcdf où l'une des variables ont des nans en elle. Je veux lire le fichier, puis remplacer les nans par -9999. puis sauvegardez les modifications du nouveau fichier netcdf. Jusqu'à présent, j'ai ceci:remplacer Nans avec -9999 dans le fichier netcdf existant avec Python

import netCDF4 as nc 
from netCDF4 import Dataset 
import numpy as np 

f = Dataset('anen_12km_1yr_san_angelo_00Z_100m_38_small_2014.nc','r+') 
f.variables['wspd_wrf_m'][:][f.variables['wspd_wrf_m'][:] == np.nan] = -9999. 
f.close() 

Quand je rouvre ce dossier et imprimer np.max ou np.min de cette variable que je reçois encore nan au lieu de -9999. Que dois-je faire pour remplacer les nans dans ce fichier netcdf et réécrire un nouveau fichier netcdf avec les changements des nans remplacés?

+0

Puis-je demander si vous voulez -9999 être encore reconnu comme « manquant » dans le netcdf _FillValue métadonnées? c'est-à-dire qu'un logiciel tel que ncview va traiter -9999 comme manquant dans le fichier révisé? –

Répondre

3

Vous ne pouvez pas utiliser la comparaison == np.nan. Considérez cet exemple:

arr = np.random.random(3) 
arr[1] = np.nan 
print(arr) 
print(arr == np.nan) 

Cela donne:

tableau

([0,88978822, nan, 0,71066851])

[Faux Faux Faux]

La bonne façon de vérifier pour NaNs utilise np.isnan:

print(np.isnan(arr)) 

qui retourne:

[Faux Vrai Faux]

Vous pouvez l'utiliser pour remplacer le NaN, semblable à ce que vous faites maintenant:

arr[np.isnan(arr)] = -9999 
-1

Comme alternative pour faire cela en python, vous pouvez aussi effectuer ceci en une ligne à partir de la ligne de commande en utilisant CDO:

cdo setmissval,-9999 in.nc out.nc 

Cela va changer toutes les valeurs manquantes à -9999 et également définir les métadonnées _FillValue à -9999 dans le fichier out.nc

+0

Oui, je remplaçais le nan avec -9999 parce que cela va être ma valeur de remplissage pour manquant pour mon fichier netcdf. – HM14