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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:01:07