R 如何基于时间戳将函数与特定netCDF文件关联

R 如何基于时间戳将函数与特定netCDF文件关联,r,function,raster,netcdf,netcdf4,R,Function,Raster,Netcdf,Netcdf4,我有73个netCDF文件,每个文件代表一个日历年的5天间隔,并且有几个变量。每个文件有120层,表示每小时的间隔 我已将它们全部读入R,并使用ncdf4包对它们进行了适当的命名,如下所示: filenames <- list.files(path=getwd()) for(i in filenames) { ncin <- nc_open(i) ds<-paste(i) assign(ds, ncin) print(i) } 我想做的是根据数据帧的日

我有73个netCDF文件,每个文件代表一个日历年的5天间隔,并且有几个变量。每个文件有120层,表示每小时的间隔

我已将它们全部读入R,并使用
ncdf4
包对它们进行了适当的命名,如下所示:

filenames <- list.files(path=getwd()) 

for(i in filenames) {
  ncin <- nc_open(i)
  ds<-paste(i)
  assign(ds, ncin)
  print(i)
  }
我想做的是根据数据帧的日期戳将数据帧与正确的netCDF文件和图层相匹配,即,如果数据帧在一年中的第1天和第5天之间,则将是netCDF文件1等。。然后,我想将netCDF文件中的变量数据插入到具有数据帧的相关日期时间戳的位置数据中。因此,在数据帧提供的给定时间和地点,netCDF文件中同一日期和时间的变量V的值是多少。我可以使用循环函数完成第一部分,但编写代码效率极低且耗时:

function(dataframe){
d <- dataframe[i,]
if(between(d$datetime, 2017-01-01 00:00:00, 2017-01-05 23:59:59){ncfile <- file1} else if (between(d$datetime, 2017-01-06 00:00:00, 2017-01-010 23:59:59)) 
     {ncfile <- file2}}
最多

PFOW_Climatology2_0073_1993-12-27.nc
利用

fd <- as.Date(substr(filenames, 24, 36))

fd如果不提供更多信息,最好是一些示例数据,就很难给出一个好的答案

你的“恰当命名”是非常不恰当的。在日常生活中,你真的不需要
分配
。列个清单就行了

library(ncdf4)
x <- lapply(filenames, nc_open)
库(ncdf4)

如果你不提供更多的信息,最好是一些示例数据,就很难给出一个好的答案

你的“恰当命名”是非常不恰当的。在日常生活中,你真的不需要
分配
。列个清单就行了

library(ncdf4)
x <- lapply(filenames, nc_open)
库(ncdf4)

x谢谢你@RobertH。我已经对问题进行了修改,纳入了更多信息,并更新了内容,纳入了您最近提出的非常有用的建议。我无法让你的{which}函数工作,所以我使用了'findInterval'。但是我不确定你的函数应该如何工作。如果尝试对ncdf4对象进行分块,则会出现错误:“找不到用于签名的函数“raster”的继承方法”“ncdf4”
brick
应用于文件名,而不是ncdf4对象谢谢@RobertH。我已经对问题进行了修改,纳入了更多信息,并更新了内容,纳入了您最近提出的非常有用的建议。我无法让你的{which}函数工作,所以我使用了'findInterval'。但是我不确定你的函数应该如何工作。如果尝试对ncdf4对象进行分块,则会出现错误:“找不到用于签名的函数“raster”的继承方法”“ncdf4”
brick
应用于文件名,而不是ncdf4对象
fd <- as.Date(substr(filenames, 24, 36))
i <- findInterval(dd, fd) 
df$file <- i
library(ncdf4)
x <- lapply(filenames, nc_open)
library(raster)
x <- lapply(filenames, brick)
fd <- as.Date(subtr(filenames, 4, 12))
dd <- as.Date(df$datetime)
i <- which(dd > fd[-length(fd)] & dd < fd[-1]) + 1 

df$file <- filenames[i]
df$id <- 1:nrow(df)
ff <- unique(df$file)
vv <- sapply(ff, function(f) {
         v <- extract(brick(f), df[df$file == f , c('lon', 'lat')])
         data.frame(file=f, xy, v)
      })