2016-11-16 10 views
0

for 루프에 넣을 때 내 as.Date 함수가 다른 결과를주는 약간의 문제입니다. 이미지가있는 하위 폴더 (날짜 별)가있는 폴더를 찾고 있습니다. 필자는 모든 날짜를 구성하기 위해 date_list를 작성합니다 (나중에 옵션을 계획하기 위해). 율리우스 데이는 1 월 1 일부터 시작되므로 4 년의 날짜가 있기 때문에 유연해야합니다.as.Date 함수는 for 루프에서 다른 결과를 제공합니다.

# Set up list with 4 columns and counter Q. jan is used to set all dates to the first of january 
date_list <- outer(1:52, 1:4) 
q = 1 
jan <- "-01-01" 

for (scene in folders){ 
    year <- as.numeric(substr(scene, start=10, stop=13)) 
    day <- as.numeric(substr(scene, start=14, stop=16)) 
    datum <- paste(year, day, sep='_') 
    date_list[q, 1] <- datum 
    date_list[q, 2] <- year 
    date_list[q, 3] <- day 
    date_list[q, 4] <- as.Date(day, origin = as.Date(paste(year,jan, sep=""))) 
    q = q+1 
} 

출력 마지막 행 :

[52,] "2016_267" "2016" "267" "17068" 

내가 date_list에서 실종 무엇 [질문 4] 날짜로 내 정수를 전송하지 않습니다? 다음 코드를 작동하지만 때문에 내가 이것을 자동화 좋아하는 장면과 폴더의 많은 양에 수행 실행 :

as.Date(day, origin = as.Date(paste(year,jan, sep=""))) 

이 시간 내 주셔서 감사를!

+1

에 무엇'folders'? 나는 당신이 원하는 것을 성취 할 수있는 더 좋은 방법이 있다고 생각합니다. 'as.Date()'호출을'origin' 매개 변수에서 제거해야하고,'as.Date' 함수는 매개 변수를 필요에 따라 날짜로 변환합니다. 또는 특정 경우, 여기에서도 기점을 제공해야합니다. – Tensibai

+0

@Tensibai 폴더 안에는 1 일 및 52 일 동안 수집 한 잔뜩 위성 이미지가 있습니다. 이미지 이름에 저장 날짜가 있습니다 : LC81730382016267LGN00. 이 예는 2016 년 267 일에 캡처 한 것입니다. 다음은 as.Date (일, 출처 = as.Date (붙여 넣기 (연도, jan, sep = ""))) 2016-09- 24, 내가 원하는거야. 그러나 그것은 성공적으로 date_list에 저장하지 않습니다 – Jobbo90

+0

나는'dput folders'가 당신을 도울 것이라고 말했습니다 : – Tensibai

답변

0

글쎄, 나는 이것이 당신의 첫 번째 질문에 대답 할 가정

date_list[q, 4] <- as.character(as.Date(datum,format="%Y_%j")) 

as.Date에서, %j는 줄리안 날 (이 %가 Y와 % j는 strptime에 설명되어 있습니다)하는 format 인수를 받아들이을,이다 원점 및 다중 붙여 넣기 호출을 사용하는 것보다 읽기가 조금 쉬워졌습니다.

귀하의 문제는 실제로 Date 목적이 무엇인지에 연결되어

:

> dput(as.Date("2016-01-10")) 
structure(16810, class = "Date") 

가 이전과 같은 특별한 치료없이 승 문자로 강요되는 matrix (당신의 date_list)에 들어갔을 때 :

> d<-as.Date("2016-01-10") 
> class(d)<-"character" 
> d 
[1] "16810" 

따라서 1970-01-01 년 이후의 일 수만 표시됩니다. as.character으로 문자 표현으로 날짜를 묻는 경우 Date 클래스는 문자 값을 반환하기 전에 인간 형식의 날짜를 먼저 계산하는 as.character 메서드이므로 올바른 값을 제공합니다. 이제


내가 이런 식으로 갈 것 당신의 문제를 이해하는 경우 :

먼저 하나의 문자열에서 작동하는 함수를 만들 :

name_to_list <- function(name) { 
    dpart <- substr(name, start=10, stop=16) 
    date <- as.POSIXlt(dpart, format="%Y%j") 
    c("datum"=paste(date$year+1900,date$yday,sep="_"), "year"=date$year+1900, "julian_day"=date$yday, "date"=as.character(date)) 
} 

이 기능은 당신의 문자열을 얻을를 한 다음 POSIXlt 클래스로 변환하면 줄리안의 날, 연도 및 날짜가 한 번에 전달됩니다. 연도는 1900 년 이후 정수로 저장되므로 (음수 일 수 있음) 필드에 연도를 저장할 때 1900을 더해야합니다.

그런 다음 folders 변수가 문자열의 벡터 인 경우 folders=c("LC81730382016267LGN00","LC81730382016287LGN00","LC81730382016167LGN00")에 대한

lapply(folders,name_to_list) 

느릅 나무가 있습니다 :

[[1]] 
     datum   year julian_day   date 
    "2016_266"  "2016"  "266" "2016-09-23" 

[[2]] 
     datum   year julian_day   date 
    "2016_286"  "2016"  "286" "2016-10-13" 

[[3]] 
     datum   year julian_day   date 
    "2016_166"  "2016"  "166" "2016-06-15" 
+0

오늘의 영웅! 고맙습니다! 첫 번째 부분에 한 가지 주석을 달았습니다. for 루프 (이미지가있는 폴더를 통해 반복) 내에서 여전히 작동하지 않습니다. 루프 바깥쪽에 있습니다. 그러나 귀하의 응용 프로그램 기능은 훌륭하게 작동합니다. – Jobbo90

+0

@ Jobbo90 사실 처음에 부분을 간과 했으므로 좀 더 자세한 설명과 정확한 수정을 위해 대답을 편집했습니다. – Tensibai

0

오늘을 3 자리 숫자로 출력 하시겠습니까? 2 숫자가 아니어야합니까?

day <- as.numeric(substr(scene, start=15, stop=16)) 

또는 적어도 문제의 일부가 될 수

day <- as.numeric(substr(scene, start=14, stop=15)) 

. "장면"의 전형적인 가치가 무엇인지 보여주는 예가 있으면 도움이 될 것입니다.

+0

줄리안 일은 1부터 365까지의 값의 범위이므로 하루가 세자리 수입니다. 그래서 그게 어떻게 문제의 일부가 될지 모르겠습니다. Scene은 폴더에있는 이미지의 이름입니다. 사용하는 itirator입니다. 좋아요 : 'LC81730382016267LGN00' 감사합니다. – Jobbo90

+0

아, 그 줄리안 날에, 나는 안다, 나쁘다! – user3466328