2017-05-03 1 views
0

Je suis nouveau sur xarray et j'aimerais savoir si je fais quelque chose de mal.Pourquoi les NaNs sont-ils introduits dans la variable de dimension lors du chargement d'un fichier netcdf dans le jeu de données xarray?

J'ai un fichier netcdf contenant trois groupes (A, B, C) dont chacun contient plusieurs variables ayant juste une dimension temporelle ainsi qu'une variable 'time_dimension' correspondante. La variable de dimension temporelle utilise des horodatages Unix pour ses valeurs.

Dans l'exemple ci-dessous, j'ouvre le fichier Netcdf et j'imprime les min et max de l'horodatage pour chaque groupe. Cela me donne la plage attendue d'horodatages. Je charge ensuite chaque groupe du fichier netcdf dans un jeu de données xarray en utilisant la commande open_dataset. Pour ces jeux de données, j'imprime de nouveau les min et max de l'horodateur de la dimension temporelle. Les valeurs min sont les mêmes que celles obtenues en lisant directement le fichier netcdf mais les valeurs max contiennent des NAN pour deux des groupes (A et B).

Bien que je ne le montre pas dans le code, les valeurs NAN sont toutes situées à la fin du tableau de valeurs variables xarray. De plus, le groupe A contenait 4 valeurs NAN alors que le groupe B en contenait un peu plus. Notez également que la taille des variables netcdf est la même que celle des variables xarray pour chaque groupe.

Est-ce que quelqu'un sait pourquoi les valeurs NAN sont introduites dans mes coordonnées de dimension temporelle lorsqu'elles sont importées dans xarray à partir de netcdf?

Ceci est le code que j'utilisé pour démontrer le problème

import xarray as XR 
from netCDF4 import Dataset 

Filename = r'C:\temp\My_data.nc' 

#-------------- load netcdf data directly ----------- 

print('netcdf') 

root = Dataset(Filename,'r',format='NETCDF4') 
grp = root.groups['A'] 
dt = grp.variables['time_dimension'][:] 
print('group A: ',min(dt), max(dt)) 

grp = root.groups['B'] 
dt = grp.variables['time_dimension'][:] 
print('group B: ',min(dt), max(dt)) 

grp = root.groups['C'] 
dt = grp.variables['time_dimension'][:] 
print('group C: ',min(dt), max(dt)) 

root.close() 

print(' ') 
print(' ') 

#-------------- load netcdf data via xarray ----------- 

print('xarray loaded from netcdf') 

ax = XR.open_dataset(Filename, group='A', decode_times=False) 
dt = ax['time_dimension'].values 
print('group A: ', min(dt), max(dt)) 
ax.close() 

ax = XR.open_dataset(Filename, group='B', decode_times=False) 
dt = ax['time_dimension'].values 
print('group B: ', min(dt), max(dt)) 
ax.close() 

ax = XR.open_dataset(Filename, group='C', decode_times=False) 
dt = ax['time_dimension'].values 
print('group C: ', min(dt), max(dt)) 
ax.close() 

Ceci est la sortie du code ci-dessus

netcdf 
group A: 1417532400.0 1480406400.0 
group B: 1392129000.0 1439217000.0 
group C: 1432913400.0 1436888700.0 


xarray loaded from netcdf 
group A: 1417532400.0 9.96920996839e+36 
group B: 1392129000.0 9.96920996839e+36 
group C: 1432913400.0 1436888700.0 

Répondre

0

Il semble que le problème a été causé par ne pas spécifier Fill_value ou missing_value lorsque les variables du fichier Netcdf ont été créées à partir de tableaux chiffrés maspés.

Cela semble avoir permis de transmettre les valeurs NaN masquées à l'ensemble de données xarray.

La définition d'une valeur de remplissage lorsque la variable de fichier Netcdf a été réduite a résolu ce problème.