2017-04-13 1 views
0

J'ai un jeu de données quadrillé avec trois dimensions: lat, lon et temps.Utilisez xarray pour obtenir des sommes à temps pour chaque point d'une grille

<xarray.Dataset> 
Dimensions:  (lat: 185, lon: 155, time: 8760) 
Coordinates: 
    * lon   (lon) float64 -76.98 -76.92 -76.86 -76.8 -76.74 ... 
    * lat   (lat) float64 33.55 33.6 33.66 33.71 33.76 33.82 ... 
    * time   (time) datetime64[ns] 2010-01-01 2010-01 01T01:00:00.028800 ... 
Data variables: 
    u   (time, lat, lon) float64 nan nan nan nan nan nan nan nan ... 
    v   (time, lat, lon) float64 nan nan nan nan nan nan nan nan ... 
    u_err  (time, lat, lon) float64 nan nan nan nan nan nan nan nan ... 
    v_err  (time, lat, lon) float64 nan nan nan nan nan nan nan nan ... 

Je voudrais obtenir une moyenne de tous les u et v dans le temps, que je peux faire par ce qui suit:

ds_seasonal = ds.groupby('time.season').mean('time') 

Cependant, je veux seulement obtenir la moyenne de l'ensemble de données pour chaque point de grille où il y a des données présentes 50% du temps ou plus. Dans MATLAB, je mettrais tout dans un tableau structuré et ce serait aussi simple que nans=sum(~isnan(u),3); que je comparerais ensuite à 4335 ou 50% de la dimension temporelle. J'apprends juste comment utiliser xarray pour le calcul. Est-ce possible avec xarray?

Répondre

1

where est le moyen de masquer les valeurs dans xarray. Vous pouvez l'utiliser pour écrire une fonction d'agrégation personnalisée avec groupby.apply(), par exemple,

def custom_mean(ds): 
    missing_frac = result.isnull().mean('time') 
    return result.mean('time').where(missing_frac < 0.5) 

result = ds.groupby('time.season').apply(custom_mean)