【问题标题】:Manipulate variables in netcdf files and write them again操作netcdf文件中的变量并再次写入
【发布时间】:2013-02-19 23:00:05
【问题描述】:

我有几个 netcdf 文件。每个 nc 文件都有几个变量。我只对两个变量“Soil_Moisture”和“Soil_Moisture_Dqx”感兴趣。

我想根据“Soil_Moisture_Dqx”过滤“Soil_Moisture”。只要相应的“Soil_Moisture_Dqx”像素的值大于 0.04,我就想用 NA 替换“Soil_Moisture”中的值。

:这里是要下载的文件:

1- 我尝试了这个循环,但是当我输入 f[1] 或 f[2] 时,我得到了一些奇怪的东西,这意味着我的循环不正确。我很感谢任何帮助来纠正我的循环。

 a<-list.files("C:\\3 nc files", "*.DBL", full.names = TRUE)

for(i in 1:length(a)){
f=open.ncdf(a[i])
A1 = get.var.ncdf(nc=f,varid="Soil_Moisture",verbose=TRUE)
A1* -0.000030518509475997 ## scale factor
 A2 = get.var.ncdf(nc=f,varid="Soil_Moisture_Dqx",verbose=TRUE)
A2*-0.0000152592547379985## scale factor
A1[A2>0.04]=NA ## here is main calculation I need
 }

2- 谁能告诉我再写一遍?

【问题讨论】:

  • 比例因子看起来很难看!你是怎么得到这个的?
  • 来自变量(A)元数据[1] "var has BOTH add_offset ( 0 ) and scale_fact ( 3.05185094759971e-05 )"
  • 更新 A1 后,您需要使用 NA 值再次保存文件,不是吗?
  • 是的,正是我需要的。根据条件更新它A1[A2&gt;0.04]=NA
  • 我问是因为我在您的代码中没有看到任何 save ,例如 put.var.ncdf 和 close(f)..

标签: r netcdf cdo-climate


【解决方案1】:

缺失值是netCDF文件中的特殊值,其值将被视为指示数据 不见了”。所以你需要使用set.missval.ncdf来设置这个值。

a<-list.files("C:\\3 nc files", "*.DBL", full.names = TRUE)

SM_NAME <- "Soil_Moisture"
SM_SDX_NAME <- "Soil_Moisture_Dqx"
library(ncdf)
lapply(a, function(filename){
  nc <- open.ncdf( filename,write=TRUE )
  SM <- get.var.ncdf(nc=nc,varid=SM_NAME)
  SM_dqx <- get.var.ncdf(nc=nc,varid=SM_SDX_NAME)
  SM[SM_dqx > 0.4] <- NA
  newMissVal <- 999.9
  set.missval.ncdf( nc, SM_NAME, newMissVal )
  put.var.ncdf( nc, SM_NAME, SM )
  close.ncdf(nc)
 })

编辑添加一些检查

在这里计算有多少点被标记为错过是很有趣的。

不应用我们拥有的奇数比例因子:

lapply(a, function(filename){
  nc <- open.ncdf( filename,write=TRUE )
  SM_dqx <- get.var.ncdf(nc=nc,varid=SM_SDX_NAME)
   table(SM_dqx > 0.4)
  })

[[1]]
[1] 810347     91

[[2]]
[1] 810286    152

[[3]]
[1] 810287    151

[[4]]
[1] 810355     83

【讨论】:

  • 非常感谢。但是,我得到了这个错误:Error in put.var.ncdf(nc, SM_NAME, SM) : NAs in foreign function call (arg 5)
  • 什么是比例因子,我在你的回答中看不到它!
  • SM[SM_dqx &gt; 0.4] &lt;- NA 不能为真,除非应用了比例因子。请添加它。我遇到的错误呢?
  • 这真是令人费解。看来nc文件考虑到了比例因子!不需要申请。我不确定。请专家帮助我们解决这个问题?
  • 我收到此错误:Error in put.var.ncdf(nc, SM_NAME, SM) : NAs in foreign function call (arg 5)
【解决方案2】:

这也可以使用 CDO 从命令行完成。

据我了解,这两个变量都包含在您的输入文件中(我将其称为“datafile.nc”,您可能希望在文件列表的循环中执行以下操作),所以首先我们将提取这两个变量放到两个单独的文件中:

cdo selvar,Soil_Moisture     datafile.nc soil_moisture.nc
cdo selvar,Soil_Moisture_Dqx datafile.nc dqx.nc

现在我们将定义一个掩码文件,当 dqx=0.04 时包含 NAN

cdo setctomiss,0 -ltc,0.04 dqx.nc mask.nc

ltc 是“比常数”(您可能希望 lec 代替

现在我们将它们与 CDO 相乘 - NAN*C=NAN 和 1*C=C,这样就可以得到一个带有所需字段的 netcdf:

cdo mul mask.c soil_moisture.nc masked_soil_moisture.nc 

如果您愿意,实际上可以将最后两行组合在一起,并避免编写掩码文件的 I/O:

cdo mul -setctomiss,0 -ltc,0.04 dqx.nc soil_moisture.nc masked_soil_moisture.nc 

但是单独解释这些步骤更容易:-)

您可以在 bash 中轻松地将整个内容放在文件的循环中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多