2017-11-15 25 views
0

각 연도의 5 일 간격을 나타내는 73 개의 netCDF 파일이 있으며 여러 변수가 있습니다. 각 파일에는 시간 간격을 나타내는 120 개의 레이어가 있습니다. 내가 R에 그들 모두를 읽고 그들을 적절하게 그렇게 같이 ncdf4 패키지를 사용하여 명명 한타임 스탬프를 기반으로 특정 netCDF 파일에 함수를 연결하는 방법

:

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

for(i in filenames) { 
    ncin <- nc_open(i) 
    ds<-paste(i) 
    assign(ds, ncin) 
    print(i) 
    } 

나는 또한 netCDF의 파일 (위도 - 경도)와 같은 투영 위치의 데이터 프레임을 가지고 그러나 이러한 위치는 불규칙적으로 전체 연도에도 적용됩니다. 데이터의 샘플은 다음과 같습니다

>head(df) 
> Lon  Lat   datetime 
2 -3.179046 58.65417 2016-09-30 17:25:38 
3 -3.180403 58.65483 2016-09-30 17:29:43 
4 -3.187734 58.66102 2016-09-30 21:22:51 
5 -3.190197 58.66409 2016-09-30 22:02:47 
6 -3.182058 58.67433 2016-10-01 06:16:08 
7 -3.181318 58.67475 2016-10-01 06:20:31 

내가 뭘하려고 오전 거기에 따라 올바른 netCDF의 파일과 레이어에 데이터 프레임과 일치하는 것입니다은 1 일 5의 사이에 있다면 즉, 날짜 스탬프입니다 그 해 netCDF 파일 1 등이 될 것입니다. 그런 다음 데이터 프레임의 연관된 datetime 스탬프가있는 위치 데이터에 netCDF 파일의 변수 데이터를 보간합니다. 따라서 주어진 시간과 장소에서 데이터 프레임에 의해 제공된, 같은 날짜와 시간에 변수 V의 값은 netCDF 파일에 무엇입니까? 나는 루프 기능을 사용하여 첫 번째 부분을 할 수 있지만 코드에 소요되는 조잡한 비효율적이고 시간 :

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

내가 가장 좋은 방법에 관해서는 확실 해요 전에 등등 ... netCDF의 파일과 함께 일한 적이 데있다. 어떤 제안?

################# UPDATE

나는 순차적으로 명명 된 파일에서

filenames <- list.files(path=getwd()) 
x <- lapply(filenames, nc_open) 

추출물 날짜를 사용에 netCDF의 파일을 읽을 :

PFOW_Climatology2_0001_1993-01-01.nc 
PFOW_Climatology2_0002_1993-01-06.nc 

최대

0,123,516을 사용하여

PFOW_Climatology2_0073_1993-12-27.nc 

fd <- as.Date(substr(filenames, 24, 36)) 
나는 각각의 데이터 포인트과 같이 FD에 해당하는 내 간격 find9ing하여 dataframe에 대한 참조 열을 생성

:

i <- findInterval(dd, fd) 
df$file <- i 

답변

1

당신이 더를 제공하지 않고 좋은 대답을하는 것은 매우 어렵다를 정보, 그리고 이상적으로는 몇 가지 예제 데이터.

귀하의 "적절한 이름 지정"은 매우 적절하지 않습니다. 일상 생활에서 assign을 정말로 필요로하지 않아야합니다. 그냥 목록을 만드십시오.

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

하지만 당신은 위치에 따라 값을 추출 할 필요가 있기 때문에, RasterBrick 개체의 목록을 만드는 것이 더 나을 수 있습니다 :

library(raster) 
x <- lapply(filenames, brick) 

을하지만 나도 그렇게 할 것입니다.

먼저 파일 이름을 df $ datetime과 일치시킵니다. 파일 이름의 모양을 알려주지 않으므로 그렇게하는 법을 알 수는 없습니다. 하지만 루프는 필요 없습니다. 파일 이름에서 날짜를 추출하고, 적절한 날짜 (및 시간?) 객체와

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) 
     }) 

vv는이 5 대응을 위해, 각각의 경우에 대한 값으로 data.frame해야한다 하루 간격. 여기에서 120 개의 값 중에서 원하는 시간을 선택 (또는 보간)하십시오.

임시 보간 작업을 수행한다고 가정합니다. (또한) 공간 보간을 사용하려면 extract

을 사용하십시오. 예를 들어 데이터가 없으므로 다시 작동하지 않을 수 있습니다. 그러나이 선을 따라 무언가가 효과가 있습니다.

+0

@RobertH. 나는 질문을 수정하여 더 많은 정보를 포함시키고 가장 최근에 제안한 내용을 포함하도록 업데이트하여 매우 도움이되었습니다. {which} 함수가 작동하지 않아 findInterval을 대신 사용했습니다. –

+0

그러나 나는 당신의 기능이 어떻게 작동해야하는지 확신하지 못합니다. ncdf4 객체를 벽돌로 만들려고하면 ''ncdf4 ''에 대한 함수 'raster'에 상속 된 메소드를 찾을 수 없습니다 ' –

+0

'brick'을 ncdf4 객체가 아닌 파일 이름에 사용해야합니다. – RobertH