【问题标题】:python xarray concat groupby in datetime64 dimensionspython xarray concat groupby在datetime64维度
【发布时间】:2016-09-25 17:30:38
【问题描述】:

我有一个 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 变量中有 nans,但整个数组不是 nans。 维度时间长度对应10年的每日数据(3652天)。

我想要做的是获得 10 年时间序列的每月平均值,每个月和每个网格正方形(纬度,经度)。 所以输出数据集是:

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

我看到的一个几乎可以满足我想要的选项是:

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

但是,它的输出只是一个 12 项数组。即我们失去了 lat 和 lon 维度。

<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 方式?

谢谢

【问题讨论】:

    标签: python datetime64 python-xarray


    【解决方案1】:

    为避免聚合每个子数组中的所有维度,您需要明确提供维度列表:

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

    (在某一时刻,我们考虑将其作为 groupby 操作的默认行为,因为这通常是我们所希望的,但目前尚不清楚如何触发当前对所有维度求和的默认行为。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-01
      • 2020-10-15
      • 1970-01-01
      • 2022-07-25
      • 2016-10-30
      • 2017-01-30
      • 2021-11-10
      • 2019-06-28
      相关资源
      最近更新 更多