2017-09-01 10 views
0

J'ai un fichier qui est des données mensuelles pour un an (12 points). Les données commencent en décembre et se terminent en novembre. Je souhaite créer un fichier de moyenne mobile de 3 mois qui serait DJF, JFM, ..., SON (10 points)python-xarray: exemple de laminage

J'ai remarqué qu'il y a une fonction DataArray.rolling qui retourne une option de fenêtre mobile et je pense que sois utile pour ça. Cependant, je n'ai trouvé aucun exemple utilisant la fonction de roulement. J'avoue que je ne suis pas familier avec bottleneck, pandas.rolling_mean ou le plus récent pandas.rolling donc mon niveau d'entrée est assez faible.

est ici un code à tester:

import numpy as np 
import pandas as pd 
import xarray as xr 

lat = np.linspace(-90, 90, num=181); lon = np.linspace(0, 359, num=360) 
# Define monthly average time as day in middle of month 
time = pd.date_range('15/12/1999', periods=12, freq=pd.DateOffset(months=1)) 
# Create data as 0:11 at each grid point 
a = np.linspace(0,11,num=12) 
# expand to 2D 
a2d = np.repeat(tmp[:, np.newaxis], len(lat), axis=1) 
# expand to 3D 
a3d = np.repeat(a2d[:, :, np.newaxis], len(lon), axis=2) 
# I'm sure there was a cleaner way to do that... 

da = xr.DataArray(a3d, coords=[time, lat, lon], dims=['time','lat','lon']) 

# Having a stab at the 3-month rolling mean 
da.rolling(dim='time',window=3).mean() 
# Error output: 
Traceback (most recent call last): 
File "<ipython-input-132-9d64cc09c263>", line 1, in <module> 
da.rolling(dim='time',window=3).mean() 
File "/Users/Ray/anaconda/lib/python3.6/site-packages/xarray/core/common.py", line 478, in rolling 
center=center, **windows) 
File "/Users/Ray/anaconda/lib/python3.6/site-packages/xarray/core/rolling.py", line 126, in __init__ 
center=center, **windows) 
File "/Users/Ray/anaconda/lib/python3.6/site-packages/xarray/core/rolling.py", line 62, in __init__ 
raise ValueError('exactly one dim/window should be provided') 

ValueError: exactement une faible/fenêtre doit être fournie

Répondre

0

Vous êtes très proche. Le rolling method prend une paire clé/valeur qui correspond à dim/window_size. Cela devrait fonctionner pour vous.

da.rolling(time=3).mean() 
+0

Merci. La façon la plus simple de laisser tomber les nans était simplement da.rolling (time = winlen) .mean() [winlen-1 ::,:,:] je ne sais pas s'il y avait quelque chose de mieux. Attention si je fais un petit PR pour ajouter cet exemple au DOC de https://github.com/pydata/xarray/blob/master/xarray/core/rolling.py Y at-il une liste des fonctions disponibles à l'objet roulant moyenne, somme, médiane, etc. –

+1

Il y a donc deux choses que vous pouvez faire pour aider les nans: 1) vous pouvez définir 'min_periods' à un entier (par exemple' da.rolling (min_periods = 0, time = 3) .mean() '), ou 2) vous pouvez supprimer les NaN en utilisant 'dropna' (par exemple, da.rolling (time = 3) .mean(). Dropna ('time)'). Nous sommes toujours ouverts aux gens aident à améliorer la documentation de xarray. – jhamman