2013-05-29 3 views
1

나는 과거에 알고있는 날짜 목록을 갖고 있지만 형식은 28/MAY/13입니다. 세기없이r - as.Date로 Y2K 극복

%y 년도 : 밖으로 그들의 날짜 클래스를 만드는 가장 가까운 방법은 ?as.Date 페이지 노트로 이전 1968 이상의 날짜를 제외한 모든 날짜에 대해 잘 작동 기본

dates <- as.Date(dates, format="%d/%b/%y") 

입니다 (00-99). 입력시 00에서 68까지의 값은 20과 69에서 99로 19만큼 앞선다. 이것은 2004 및 2008 POSIX 표준에 지정된 동작이지만 '향후 버전에서는 2 자리 연도가 변경됩니다.

엑셀은 30을 초과하는 모든 것이 1930 등이라고 가정하면 이보다 조금 더 좋습니다.하지만 가능한 경우 1914 년으로 돌아가는 것을 선호합니다. R이 과거와 같이 모든 날짜를 해석하도록 요구할 수 있습니까? 이 같은

+1

왜 2013 년 이후의 날짜에서 100 년을 뺄까요? – Roland

답변

3

뭔가 :

Sys.setlocale("LC_TIME", "English") 

dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y") 
#[1] "2013-05-28" "2014-05-28" 

sub100 <- function(x) { 
    x <- as.POSIXlt(x) 
    x$year <- x$year-100 
    as.Date(x) 
} 


dates[dates > as.Date("2013-12-31")] <- sub100(dates[dates > as.Date("2013-12-31")]) 
#[1] "2013-05-28" "1914-05-28" 
2

롤랜드의 대답의 작은 정제. 완전히 새로운 sub100 기능을 사용하는 대신 lubridateyear 기능을 사용하십시오.

library(lubridate) 
dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y") 
after_cut_off <- dates > as.Date("2013-12-31") 
dates[after_cut_off] <- dates[after_cut_off] - years(100) #this is the new bit 
+0

나는이 답변을 정말 좋아하지만 Roland의 대답은 기본 R에도 적용됩니다 (비록 내가 지정하지 않았더라도). 그래서 그에게 눈금을 주려고합니다. – Hugh

0

어쩌면 내가 밀도 해요,하지만 왜 %Y (자본)를 사용하지? ?strptime에 이어 1 년 동안 세기를 가져야합니다.

+0

01/JAN/67은 01/JAN/0067 (즉 67AD)로 해석되므로 작동하지 않습니다. – Hugh

0

나를 위해 완벽하게 작동하는 하나의 솔루션이 있습니다.

Y2K 엑셀 문제 : "= YEAR()"기능으로 전환보다는 2001 1901로 간주 엑셀이 단어 일 (월 - 년) 또는 (월-01)의 모든 버전에서 . 통상, 2 워드의 일자 형식을 가지는 구 데이터베이스를 Excel에 다운로드하면 발생했습니다.

Y2K 엑셀 솔루션 (안 VBA) : 같은 날짜 형식으로 모든 (열/행)은 텍스트로, 다음은 2001 년부터 2099까지 잘 작동 (적절한 연도 형식으로 변환하는 작은 공식을 사용하여 복사), 3000 후에도 수정할 수 있습니다. 나는 그때까지 마이크로 소프트가 더 나은 해결책을 찾았다 고 확신한다.

Y2K Excel 수식 : C1 = "20"& 오른쪽 (B1,2). A1 : 원래 날짜 B1 : 텍스트 형식으로 날짜 복사 C1 : 올바른 연도로 변환하기위한 공식.