2016-05-27 89 views
0

我有一個xarray數據集是:在datetime64尺寸蟒xarray的concat GROUPBY

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... 

有在DIS變量的NaN但整個陣列是不NaN的。 維度時間的長度對應於10年的日常數據(3652天)。

我想要做的是獲得10年時間序列的每月平均值,每個月和每個網格平方(經度,緯度)。 那麼輸出數據集將是:我看到,幾乎

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

一種選擇我想要做什麼是:

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

然而,它的輸出僅僅是一個12項陣列。即我們失去了經度和緯度。

<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 

我認爲有可能簡單的方法來使用datetime64方法來做到這一點,但我一直在努力使它們充分感覺到它們。

唉,而寫這我已經做管理:

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

這給:

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

然而,還有另一個更Python的方式更符合的第一行代碼使用通過...分組?

感謝

回答

2

爲了避免聚集在每個子陣列的所有尺寸,你需要明確供應維度列表:

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

(在一個點上,我們曾考慮把這項工作作爲默認行爲groupby操作,因爲它通常是我們想要的,但是不清楚如何觸發當前在所有維度上求和的默認值。)

+0

謝謝 - 也適用於'skipna = True「' – dreab