当使用 Python 2.7 的 xarray 包时,是否可以像 pandas 那样对多个参数进行分组?本质上,像这样的操作:
data.groupby(['time.year','time.month']).mean()
如果您想获取数据集每年和月份的平均值。
不幸的是,xarray 尚不支持使用多个参数进行分组。这是我们想要支持的事情,而且相对简单,但还没人有时间实现它(欢迎贡献!)。
该功能的工作仍在进行中,但我已经找到了解决方法。您可以使用
assign_coords
创建一个新坐标,准确地表示您的分组维度,并将 groupby
与该坐标一起使用。
例如,如果您想按小时和分钟分组,则可以有效地按一天中的分钟进行分组:
ds = ds.assign_coords(
{
"year": ds["time.year"],
"month": ds["time.month"],
"day": ds["time.day"],
"minute_of_day": 60 * ds["time.hour"] + ds["time.minute"],
}
)
ds = ds.groupby("minute_of_day").mean()
自 2024 年起的解决方法,因为 xarray 仍不支持它:
import pandas as pd
import xarray as xr
# Extract values o resample
year = ds.time.dt.year.values
month = ds.time.dt.month.values
day = ds.time.dt.day.values
hour = ds.time.dt.hour.values
# Create a multi-index with year, month, day, and hour
multi_index = pd.MultiIndex.from_arrays(
[year, month, day, hour],
names=['year', 'month', 'day', 'hour']
)
# Convert the multi-index to a DataArray
multi_index_da = xr.DataArray(multi_index, dims=['time'], coords={'time': ds.time})
# Group by the multi-index DataArray and sum the values
hourly_sum = ds.groupby(multi_index_da).sum(dim='time')
index = pd.DataFrame(index=radar.ds.time.to_series()).resample('1H').sum()
hourly_sum['group'] = pd.to_datetime([f"{year}-{month}-{day} {hour}:00:00" for year, month, day, hour in hourly_sum.group.values])
hourly_sum = hourly_sum.rename({'group': 'time'})
一个简单的方法是构造一个多重索引并按“新”坐标进行分组:
da_multiindex = da.stack(my_multiindex=['time.year','time.month'])
da_mean = da.groupby("my_multiindex").mean()
da_mean.unstack() # go back to normal index