从 R 中的 NetCDF 文件获取变量和维度的紧凑列表

时间:2021-03-05 14:15:02

标签: r netcdf

我在几个目录中有大量的 NetCDF 文件,每个文件都包含一组不同的变量和维度。即,某些文件的尺寸可能与其他文件不同。 最后,我想确定具有相同名称的文件是否也包含相同的变量数量和维度数据。

我想遍历文件并为每个文件创建一个文本文件(具有相似的名称),该文件将包含一个包含变量名称和维度的简单表格。

问题是:如何将具有变量名称和维度的表放入数据框中,例如:

<头>
“id” “姓名” “类型” “纬度” “lon” “高度” “时间”
0 “O3” NC_FLOAT" 185 185 1 768
1 “二氧化氮” “NC_FLOAT” 185 18 1 768
2 “不” “NC_FLOAT” 185 185 1 768
3 “SO2” “NC_FLOAT” 185 185 1 768

编辑: 我使用 tidync 库创建了一个 DF 并循环它们以添加维度,但它还将维度列为变量,而不仅仅是变量。

library(tidync)
NCDims = tidync(paste0(NCDir, NCFile))  
Vars = as.data.frame(NCDims$variable)

Dims =as.data.frame(NCDims$dimension)
for (row in 1:nrow(Vars)) {
  VarName <- Vars[row, "name"]
  Vars[row,"lat"]    = Dims[which(Dims$name == "lat"),"length"] 
  Vars[row,"lon"]    = Dims[which(Dims$name == "lat"),"length"] 
  Vars[row,"height"] = Dims[which(Dims$name == "height"),"length"] 
  Vars[row,"Time"]   = Dims[which(Dims$name == "time"),"length"] 
}

结果:

<头>
“id” “姓名” “类型” “纬度” “lon” “高度” “时间”
0 “O3” NC_FLOAT" 185 185 1 768
1 “二氧化氮” “NC_FLOAT” 185 18 1 768
2 “不” “NC_FLOAT” 185 185 1 768
3 “SO2” “NC_FLOAT” 185 185 1 768
4 “时间” “NC_DOUBLE” 185 185 1 768
5 “纬度” “NC_FLOAT” 185 185 1 768
6 "lon" “NC_FLOAT” 185 185 1 768
7 “HGT” “NC_FLOAT” 185 185 1 768
8 "ZH" “NC_FLOAT” 185 185 1 768

有什么想法吗? 谢谢

1 个答案:

答案 0 :(得分:-1)

为了记录,这是我想出的解决方案。它可能可以改进,但对于想要快速查看多个 NetCDF 文件内容的任何人来说,这是一个开始。

library(tidync)
library(ncdf4)

setwd(NC_Dir)   # set root directory 

ListFiles = list.files(pattern = "*.nc$")
NC_Files = data.frame()
Dir_txt  = gsub("\\\\", "_", NC_Dir)
Dir_txt  = gsub(":", "", Dir_txt)

iFile = 1

for (NCFile in ListFiles){
    FullName_CF = paste0(NC_Dir, NCFile)
    NC_CF_NCDF4 <- nc_open( FullName_CF) 
    FileStartTime = NC_CF_NCDF4$dim$Time$units
    nc_close(NC_CF_NCDF4)

    NCDims = tidync(FullName_CF)  
    Vars   = as.data.frame(NCDims$variable)    
    Dims   = as.data.frame(NCDims$dimension)

    NC_Files[iFile,"FileName"  ] = NCFile
    NC_Files[iFile,"Size"      ] = format(round(file.size(NCFile)/1024/1024,digits = 0),big.mark=",",scientific=FALSE)
    NC_Files[iFile,"lat"       ] = Dims[which(Dims$name == "lat"   ),"length"]
    NC_Files[iFile,"lon"       ] = Dims[which(Dims$name == "lon"   ),"length"]
    NC_Files[iFile,"height"    ] = Dims[which(Dims$name == "height"),"length"]
    NC_Files[iFile,"Time"      ] = Dims[which(Dims$name == "time"  ),"length"]
    NC_Files[iFile,"NVariables"] = length(Vars$name)
    NC_Files[iFile,"Variables" ] = paste(Vars$name,collapse=" ")
    
    iFile = iFile+1
}

write.csv(NC_Files, file = paste0("List_NC_",Dir_txt,format(Sys.time(), '%Y_%m_%d'),".csv"))
相关问题