如何对Xarray的DataArray进行部分重塑以实现年度维度重组
解决方案
要实现将月度Xarray DataArray重塑为年度聚合的多维数组(保留经纬度坐标),可以通过Xarray原生操作或结合Numpy重塑完成,以下是两种可靠方法:
方法一:Xarray原生分组+重塑(推荐,自动保留坐标)
这种方法无需手动处理坐标,完全通过Xarray的分组和重塑API实现:
- 添加年度坐标
从时间维度提取年份,作为分组依据:
da['year'] = da.time.dt.year
- 按年度分组并重塑每组
每个年度组的维度为(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
相关产品推荐
相关产品推荐

