【问题标题】:Xarray groupby according to multi-indexsXarray groupby 根据多索引
【发布时间】:2021-12-15 10:13:15
【问题描述】:

xarray 提供了 groupby 函数,我们可以使用它来计算气候数据的异常。例如,可以根据http://xarray.pydata.org/en/stable/examples/weather-data.html计算月度天气数据的异常:

climatology = ds.groupby("time.month").mean("time")
anomalies = ds.groupby("time.month") - climatology

但是,当我们要计算每日数据的异常时,我们需要考虑闰年的 2 月 29 日。如果我们使用上面提到的语法,下面给出例子:

import pandas as pd
import numpy as np
date = pd.date_range('20110101','20161231',freq='D')
data = np.random.rand(len(date))
da = xr.DataArray(data,dims=['date'],coords=dict(date=date))
da_group = da.groupby('date.dayofyear')

此方法根据日期中的 dayofyear 划分 DataArray。但是当我们想根据日期的'month'和'day'进行分组时,我们怎么做,例如每年的Month=4和Day=14(值得一提的是2011-04的dayofyears -10 和 2012-04-10 不同)。

我尝试过da_group = da.groupby(['date.month','date.day']),但是错误 `group` must be an xarray.DataArray or the name of an xarray variable or dimension.Received ['date.month', 'date.day'] instead.似乎有问题。

那么我们如何根据日期的月份和日期进行分组呢?谢谢!

【问题讨论】:

    标签: python pandas-groupby python-xarray


    【解决方案1】:

    您可以从 pandas MultiIndex 创建一个 grouper 数组:

    In [9]: grouper = xr.DataArray(
       ...:     pd.MultiIndex.from_arrays(
       ...:         [da.date.dt.month.values, da.date.dt.day.values],
       ...:         names=['month', 'day'],
       ...:     ), dims=['date'], coords=[da.date],
       ...: )
    
    In [10]: grouper
    Out[10]:
    <xarray.DataArray (date: 2192)>
    array([(1, 1), (1, 2), (1, 3), ..., (12, 29), (12, 30), (12, 31)], dtype=object)
    Coordinates:
      * date     (date) datetime64[ns] 2011-01-01 2011-01-02 ... 2016-12-31
    

    然后您可以使用它对数据进行分组

    In [11]: da.groupby(grouper)
    

    grouping on multiple coordinates along a single dimension 上查看这个相关(但略有不同)的问题

    请注意,一旦您聚合,xarray 不会跟踪分组的 MultiIndex 维度的名称,因此您最终会得到未命名的 dims:

    In [12]: da.groupby(grouper).mean()
    Out[12]:
    <xarray.DataArray (group: 366)>
    array([0.7243612 , 0.5613106 , 0.59413407, 0.57179211, 0.68318279,
           0.49471343, 0.58264707, 0.56764063, 0.77111539, 0.57064475,
    ...
           0.45514646, 0.37333521, 0.49833203, 0.53370068, 0.54690462,
           0.69037877])
    Coordinates:
      * group          (group) MultiIndex
      - group_level_0  (group) int64 1 1 1 1 1 1 1 1 1 ... 12 12 12 12 12 12 12 12 2
      - group_level_1  (group) int64 1 2 3 4 5 6 7 8 9 ... 25 26 27 28 29 30 31 29
    

    然后您需要重命名您的坐标。但请注意,闰年日期 (2, 29) 确实出现在结果中。

    【讨论】:

    • 谢谢,这对我来说很好用。闰年日期可以通过 da_group = da.groupby('grouper').mean(dim='date'); da_common_year = da_group[:-1].
    猜你喜欢
    • 2021-05-21
    • 2017-03-09
    • 2018-06-21
    • 2016-12-30
    • 2018-08-17
    • 1970-01-01
    • 2021-01-14
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多