0

次の xarray データセットがあります。

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 ではありません。ディメンション time の長さは、10 年分の日次データ (3652 日) に相当します。

私がやりたいことは、各月と各グリッドスクエア (緯度、経度) について、10 年間の時系列の月次平均を取得することです。したがって、出力データセットは次のようになります。

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

私が見た1つのオプションは、私が望むことをほとんど行うものです:

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

ただし、groupby を使用したコードの最初の行に沿った、より Pythonic な方法はありますか?

ありがとう

4

1 に答える 1

2

各サブ配列のすべての次元を集計しないようにするには、次元のリストを明示的に指定する必要があります。

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

(ある時点で、これを groupby 操作のデフォルトの動作にすることを検討しました。これは、通常は望ましいことですが、すべてのディメンションを合計する現在のデフォルトをトリガーする方法が明確ではありません。)

于 2016-05-27T17:45:43.183 に答える