2016-05-27 5 views
0

Ich habe eine xarray Datenmenge, die ist:Python xarray concat groupby in datetime64 Dimensionen

ds 
<xarray.Dataset>  
Dimensions: (lat: 360, lon: 720, time: 3652) 
Coordinates: 
    * lon  (lon) float32 -179.75 -179.25 -178.75 -178.25 -177.75 -177.25  ... 
    * lat  (lat) float32 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 ... 
* time  (time) datetime64[ns] 2010-01-01 2010-01-02 2010-01-03 ... 
Data variables: 
dis (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan... 

Es gibt nans in der dis variabel, aber das gesamte Array ist nicht nans. Die Länge der Dimensionszeit entspricht 10 Jahren täglicher Daten (3652 Tage).

Was ich tun möchte, ist monatliche Mittel der 10-jährigen Zeitreihen, für jeden Monat und jedes Rasterquadrat (lat, lon). So Ausgabe-Dataset wäre:

Dimensions: (lat: 360, lon: 720, time: 12) #<<< or 'months' 

Eine Option, die ich sah, dass fast das tut, was ich will, ist:

ds.dis.groupby('time.month').mean() 

jedoch der Ausgang dies ist nur eine 12-Element-Array. d.h. wir verlieren sowohl die Breiten- als auch die Längenabmessungen.

<xarray.DataArray 'dis' (month: 12)> 
array([ 368.26764123, 394.0543304 , 424.67056092, 476.94943773, 
    522.383195 , 516.37355647, 497.74700652, 472.46993274, 
    456.87268206, 402.44729131, 367.41928436, 362.6121917 ]) 
Coordinates: 
* month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12 

ich dort Figur sind wahrscheinlich einfache Möglichkeiten, diese mit den datetime64 Methoden zu tun, aber ich habe gekämpft vollen Sinn von ihnen zu machen.

Ach, während ich dies schreibe ich es geschafft haben, indem Sie:

stacked = xr.concat([ds.dis[tlist[month,:],:,:].mean(dim='time',skipna=True) for month in range(0,12)],dim='month') 

die gibt:

<xarray.DataArray 'dis' (month: 12, lat: 360, lon: 720)> 

Jedoch ist eine weitere mehr pythonic Weg, um mehr im Einklang mit der ersten Zeile des Codes mit gruppiere nach?

Dank

Antwort

2

alle Dimensionen in jedem Unterfeld Aggregation über zu vermeiden, müssen Sie die Liste der Dimensionen explizit liefern:

ds.dis.groupby('time.month').mean('time') 

(An einem Punkt, den wir für diese das Standardverhalten erwog machen groupby Operationen, da es normalerweise das ist, was gewünscht wird, aber dann ist es nicht klar, wie der aktuelle Standard der Summierung über alle Dimensionen ausgelöst wird.)

+0

Danke - funktioniert auch gut mit 'skipna = True" ' – dreab