2014-03-25 1 views
14

나는 lubridate로 6 개월을 더하고 빼기를 기대하고있다. 예를 들어윤활유를 사용하여 R로 6 개월 (결합 시간)을 더하기/빼기

, 2014년 12월 31일 -> 2015년 6월 30일 및 2014년 2월 28일 -> 2014년 8월 31일

as.Date("2014-12-31")+months(6)

문제가 있다는 것이다 NA을 산출합니다. 또는 두 번째 결과는 2012 년 8 월 28 일 8 월 28 일입니다. 월에 6 개월을 추가 한 다음 그 달에 의존해야하는 시점을 알 수 있기 때문입니다.

이 문제를 신속하게 해결할 수있는 방법이 있습니까? 지금은 기본적으로 스위치를 사용하고 매달 고려할 함수를 구축하고 있지만 이것은 매우 길며 문제도 있습니다.

감사합니다.

답변

39

lubridate 기능 %m+% 여기에 유용 할 수 있습니다 :

추가하고 새로운 달

as.Date("2014-12-31") %m+% months(6) 
# [1] "2015-06-30" 

또한 두 번째를 처리 할 수있는 마지막 일을 초과하지 않고 날짜 개월 빼기 경우 ceiling_date을 사용하여 가장 가까운 달로 올림하고 days을 사용하여 하루를 빼야합니다.

ceiling_date(as.Date("2014-02-28") %m+% months(6), unit = "month") - days(1) 
# [1] "2014-08-31" 
1

방금이 코드를 빠르게 코딩했지만 작동해야한다고 생각합니다. 그러나 이것이 가장 우아한 해결책인지는 잘 모르겠습니다.

# up = 1, down = -1 
six.mo.mover<-function(date,up.or.down) { 
    last.day <- month(date) != month(as.Date(date)+1) 
    if(last.day) { 
    adj.date <- as.Date(date) - day(as.Date(date)-1) + up.or.down*months(6) 
    adj.mo <- month(adj.date) 
    if (adj.mo == 2) { 
     dy <- 28 + leap_year(year(adj.date)) 
    } 
    else { 
     dy <- 31-(adj.mo-1)%%7%%2 
    } 
    adj.date + days(dy-1) 
    } 
    else { 
    as.Date(date)+up.or.down*months(6) 
    } 
} 

NB : 디버깅되지 않으므로 직접 확인하고 알려주세요.

관련 문제