使用DIVAnd的loadobs函数时遭遇obsids类型不匹配错误
解决DIVAnd中
loadobs函数的obsids类型不匹配问题 问题重现
运行以下代码时触发类型断言错误:
@time obsval, obslon, obslat, obsdepth, obstime, obsids = loadobs(Float64, in_file, in_variable_name);
错误信息:
TypeError: in typeassert, expected Tuple{Int64, Int64}, got a value of type Tuple{Int64}
原因是NetCDF文件中的SeaDataNet标识符字段仅存储单个整数,而DIVAnd要求obsids必须是双整数元组(对应SeaDataNet标准的数据集ID+观测ID组合)。
解决方案
1. 修改NetCDF文件补充标识符字段
直接编辑NetCDF文件,将单个整数的标识符扩展为双整数元组数组:
using NCDatasets # 以追加模式打开NetCDF文件 ds = Dataset(in_file, "a") # 读取原单个整数标识符,补充第二个值(示例用0,可根据业务规则调整) old_obsids = ds["obsids"][:] new_obsids = [(id, 0) for id in old_obsids] # 删除原变量并写入新的双元组数组 delete!(ds, "obsids") defVar(ds, "obsids", new_obsids, ("obs",)) close(ds)
若原始数据实际包含独立的数据集ID和观测ID字段(如
dataset_id和observation_id),直接合并这两个字段即可:new_obsids = collect(zip(ds["dataset_id"][:], ds["observation_id"][:]))
2. 加载后手动转换obsids类型
如果不想修改原始文件,可在调用loadobs后对返回的obsids进行类型转换:
# 先加载所有返回值 obsval, obslon, obslat, obsdepth, obstime, obsids_single = loadobs(Float64, in_file, in_variable_name) # 将单个整数元组转换为双整数元组 obsids = [(x[1], 0) for x in obsids_single]
3. 调整loadobs调用参数(若支持)
检查DIVAnd的loadobs函数文档,确认是否存在可指定标识符解析规则的参数(如自定义字段名),通过参数配置让函数正确识别双整数元组结构。
关键说明
DIVAnd设计obsids为双整数元组,是为了兼容SeaDataNet的标准标识符规范:第一个整数代表数据集唯一ID,第二个代表该数据集中的观测唯一ID。若你的数据确实只有单个标识符,统一补充第二个值(如0)即可满足类型要求,不会影响后续的客观分析流程。
内容的提问来源于stack exchange,提问作者Marjahn Finlayson
相关产品推荐
相关产品推荐

