2013-11-29 6 views
0

날짜가 BW01.68, BW02.68, ..., BW26.10 인 벡터가 있습니다. BW는 "격주"를 나타냅니다. 예를 들어, "BW01.68"은 1968 년의 첫 번째 격주를 나타내며 "BW26.10"은 2010 년의 26 번째 (마지막) 격주를 나타냅니다. R을 사용하면이 벡터를 01-01-1968, 01-15-1968, ..., 12-16-2010 형식의 실제 날짜로 어떻게 변환 할 수 있습니까? R이 각 격주에 해당하는 날짜를 정확히 알 수있는 방법이 있습니까? 어떤 도움을 주셔서 감사합니다!벡터를 날짜로 변환 R

+0

데이트가 주중에 있습니까? 반환되는 모든 값이 월요일 (또는 다른 요일)일까요? 아니면이 두 주 중 날짜가 될 수 있습니까? – TheComeOnMan

+0

저는 그것이 어떤 요일인지는 중요하지 않다고 생각합니다. –

답변

0

대체 솔루션.

biwks <- c("BW01.68", "BW02.68", "BW26.10") 

bw <- substr(biwks,3,4) 
yr <- substr(biwks,6,7) 
yr <- paste0(ifelse(as.numeric(yr) > 15,"19","20"),yr) 

# the %j in the date format is the number of days into the year 
as.Date(paste(((as.numeric(bw)-1) * 14) + 1,yr,sep="-"),format="%j-%Y") 

#[1] "1968-01-01" "1968-01-15" "2010-12-17" 

나는 '바이 주'이상한 측정을 보인다 난 그냥 14 개 일내 블록을 사용하는 작업에 의도 무엇을 확신 할 수 없으므로주의한다지만.

0

이 코드를 훨씬 더 짧게 만들 수 있습니다. 나는 이해를 돕기 위해 각 단계를 간격을 두었지만 하나의 (긴) 코드 줄에서 끝낼 수있었습니다.

bw <- c('BW01.68', 'BW02.68','BW26.10','BW22.13') 

# the gsub will ensure that bw01.1 the same as bw01.01, bw1.01, or bw1.1 

#isolating year no 
yearno <- as.numeric(
    gsub(
    x = bw, 
    pattern = "BW.*\\.", 
    replacement = "" 
    ) 
) 

#isolating and converting bw to no of days 
dayno <- 14 * as.numeric(
    gsub(
    x = bw, 
    pattern = "BW|\\.[[:digit:]]{1,2}", 
    replacement = "" 
) 
) 

#cutoff year chosen as 15 
yearno <- yearno + 1900 
yearno[yearno < 1915] <- yearno[yearno < 1915] + 100 


# identifying dates 
dates <- as.Date(paste0('01/01/',yearno),"%d/%m/%Y") + dayno 
# specifically identifinyg mondays of that week no 
mondaydates <- dates - as.numeric(strftime(dates,'%w')) + 1 

출력 -

> bw 
[1] "BW01.68" "BW02.68" "BW26.10" "BW22.13" 
> dates 
[1] "1968-01-15" "1968-01-29" "2010-12-31" "2013-11-05" 
> mondaydates 
[1] "1968-01-15" "1968-01-29" "2010-12-27" "2013-11-04" 

PS : 그냥 당신이 그것을 정확하게 번역하고 있는지 당신이 BW는 데이터의 측정하는 방법과 일치하고 있다는 것을주의해야합니다. 예를 들어 bw가 발생할 수있는 경우와 같이 작동 시키려면이 값을 조작 할 수 있어야합니다.