You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Xarray的DataArray进行部分重塑以实现年度维度重组

解决方案

要实现将月度Xarray DataArray重塑为年度聚合的多维数组(保留经纬度坐标),可以通过Xarray原生操作或结合Numpy重塑完成,以下是两种可靠方法:

方法一:Xarray原生分组+重塑(推荐,自动保留坐标)

这种方法无需手动处理坐标,完全通过Xarray的分组和重塑API实现:

  1. 添加年度坐标
    从时间维度提取年份,作为分组依据:
da['year'] = da.time.dt.year
  1. 按年度分组并重塑每组
    每个年度组的维度为(12, 360, 81, 3),我们将月度(12个)和变量(3个)维度合并为一个新维度(长度36):
def reshape_annual_group(group):
    # 将每组的(time, variable)维度合并为yearly_var,维度顺序保持lon/lat不变
    return group.reshape(lon=360, lat=81, yearly_var=12*3)

# 按year分组后应用重塑,自动堆叠为(83, 360, 81, 36)的数组
da_yearly = da.groupby('year').map(reshape_annual_group)

最终的da_yearly会保留原始的longitude和latitude坐标,新增的year维度对应唯一年份,yearly_var维度按「第1个月的3个变量→第2个月的3个变量→…→第12个月的3个变量」的顺序排列。

方法二:Numpy重塑+Xarray重建(适合快速批量操作)

如果偏好Numpy的数值操作,可先处理数组再重建DataArray,需注意维度顺序:

import numpy as np
import xarray as xr

# 1. 将原始数组重塑为(year, month, lon, lat, var)
temp_array = da.values.reshape(83, 12, 360, 81, 3)
# 2. 调整维度顺序为(year, lon, lat, month, var),再合并month和var为一个维度
new_array = temp_array.transpose(0, 2, 3, 1, 4).reshape(83, 360, 81, 36)

# 3. 重建DataArray,保留经纬度坐标
da_yearly = xr.DataArray(
    new_array,
    dims=['year', 'longitude', 'latitude', 'yearly_var'],
    coords={
        'year': da.time.dt.year.unique(),  # 提取唯一年份作为坐标
        'longitude': da.longitude,
        'latitude': da.latitude
    }
)

关键注意事项

  • 确保原始时间序列无缺失月份,否则reshape会因维度不匹配报错。若存在缺失值,需先通过da.resample(time='1M').pad()或类似方法填充。
  • 可给yearly_var维度添加更清晰的坐标,比如:
    month_var_labels = [f"month{m}_var{v+1}" for m in range(1,13) for v in range(3)]
    da_yearly = da_yearly.assign_coords(yearly_var=month_var_labels)
    

内容的提问来源于stack exchange,提问作者Giacomo Giuliani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:26:14