numpy/pandas序列添加维度创建xr.DataArray报错修复方法
问题背景
现有名为obs的pandas Series,形状为(62824,),存储温度数据,样例如下:
0 16.9 1 11.0 2 5.9 3 9.4 4 15.4 ...
原计划用如下代码将对应numpy数组转换为xr.DataArray对象:
lat = 35.93679 lon = 14.45663 obs_data = xr.DataArray(obs_tas, dims=['time','lat','lon'], coords=[pd.date_range('1979-01-01', '2021-12-31', freq='D'), lat, lon])
运行代码触发报错:
ValueError: dimensions ('lat',) must have the same length as the number of data dimensions, ndim=0
初步判断报错原因是输入numpy数组仅有1个维度,尝试通过如下代码为数组新增两个维度:
obs = obs[..., np.newaxis, np.newaxis]
执行该操作后仍然出现相同报错。
报错根因
核心问题不是数据维度不足,而是传入的lat、lon是标量值,xarray会将标量坐标识别为0维附属坐标,不会将其作为独立维度匹配。即使手动将数据扩展为3维,只要坐标传入的是标量,xarray就无法将其与声明的lat、lon两个独立维度对应,因此持续报维度不匹配错误。
修复方案
二选一即可:
- 方案1:保留
time/lat/lon三维结构,将标量经纬度包装为长度为1的可迭代序列,让xarray将其识别为1维坐标,和扩展后形状为(62824,1,1)的数组匹配
import pandas as pd import numpy as np import xarray as xr # 将原始Series转为numpy数组并扩展两个维度 obs_tas = obs.to_numpy()[..., np.newaxis, np.newaxis] lat = [35.93679] lon = [14.45663] obs_data = xr.DataArray( obs_tas, dims=['time','lat','lon'], coords=[ pd.date_range('1979-01-01', '2021-12-31', freq='D'), lat, lon ] )
- 方案2:不需要手动扩展数据维度,直接将经纬度作为非维度坐标传入,更符合单点观测数据的存储逻辑
obs_data = xr.DataArray( obs.to_numpy(), dims=['time'], coords={ 'time': pd.date_range('1979-01-01', '2021-12-31', freq='D'), 'lat': 35.93679, 'lon': 14.45663 } )
注意:如果运行时提示时间维度长度不匹配,先核对原始序列的实际长度和设置的日期范围是否对应。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

