使用DIVAnd的 loadobs功能,但在 'obsid' 功能上存在问题

编程语言 2026-07-09

在Julia中,我在使用SeaDataNet的 DIVAnd 来尝试对就地观测数据进行客观分析。

我在运行这段代码:

"@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}"

我的 "in_file" 是一个NetCDF文件,里面包含一个温度变量,以及纬度、经度、深度、时间,还有一个被认为是SeaDataNet标识符的字段。我不得不将变量重命名以匹配DIVAnd的标签,但obsids(使用SeaDataNet标识符)才是问题所在。我不知道如何把in_file中的obsids变成Tuple{Int64, Int64},而不是Tuple{Int64}。

解决方案

对于SeaDataNet的 netCDF文件,相关的一个函数似乎是 DIVAnd.NCSDN.load

在相关函数 loadvar 中,似乎有几处调整会带来好处。

# Redefine DIVAnd.NCSDN.loadvar from NCSDN.jl to use `name in keys(dataset)`

import DIVAnd.NCSDN.loadvar
import DIVAnd.NCSDN.GOOD_VALUE
import DIVAnd.NCSDN.PROBABLY_GOOD_VALUE
import DIVAnd.NCSDN.QC_SUFFIX
import DIVAnd.NCDatasets.nomissing

"""
    data = loadvar(ds,param;
                   fillvalue::T = NaN,
                   qualityflags = [GOOD_VALUE, PROBABLY_GOOD_VALUE],
                   qfname = param * QC_SUFFIX,
                   )

Load the netCDF variable `param` from the NCDataset `ds`.
Data points not having the provide quality flags will be masked by `fillvalue`.
`qfname` is the netCDF variable name for the quality flags.

"""
function loadvar(
    ds,
    param;
    fillvalue::T = NaN,
    qualityflags = [GOOD_VALUE, PROBABLY_GOOD_VALUE],
    qfname = param * QC_SUFFIX,
) where {T}

    if !(param in keys(ds))                     # was: if !(param in ds)

        #@show "no data for",param
        return T[]
    end

    dataarray = Array(ds[param])
    data = nomissing(dataarray, fillvalue)

    if qfname in keys(ds)                       # was: if qfname in ds
        qf = Array(ds[qfname].var)

        keep_data = falses(size(qf))

        for flag in qualityflags
            keep_data[:] = keep_data .| (qf .== flag[1])
        end

        data[(.!keep_data)] = fillvalue
    end

    return data
end

通过这些调整,DIVAnd.NCSDN.load 可以返回非空的数据数组。

using DIVAnd

fname = "SDN_D85_WP8_netCDF_files_examples/netCDF_timeseries_tidegauge.nc"
varname = "PRES"

obsvalue,obslon,obslat,obsdepth,obstime,obsids = DIVAnd.NCSDN.load(Float64, fname, varname)
# ([15.654; 15.615; … ; 15.699; 15.68;;], [178.4535; 178.4535; … ; 178.4535; 178.4535;;], [-18.1425; -18
# .1425; … ; -18.1425; -18.1425;;], [15.654; 15.615; … ; 15.699; 15.68;;], [Dates.DateTime("1998-07-21T0
# 9:30:00"); Dates.DateTime("1998-07-21T09:40:00"); … ; Dates.DateTime("1998-09-19T11:00:00"); Dates.Dat
# eTime("1998-09-19T11:10:00");;], ["486-FI35199810007_00001_D09"; "486-FI35199810007_00001_D09"; … ; "4
# 86-FI35199810007_00001_D09"; "486-FI35199810007_00001_D09";;])
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章