2017-02-27 2 views
3

타임 스탬프 된 데이터에 대한 모델링을 예측하는 동안 R을 사용하여 (아마도 data.table을 사용하여) X 시간으로 날짜를 반올림하는 함수를 작성하려고합니다. 예 : 2시간으로 라운딩이 제공해야 할 때를 라운드 1 시간 그것은 할 매우 쉽게R에서 X 시간만큼 반올림?

"2014-12-28 22:59:00 EDT" becomes "2014-12-28 22:00:00 EDT" 
"2014-12-28 23:01:00 EDT" becomes "2014-12-29 00:00:00 EDT" 

-round.POSIXt(.date, "hour") 기능을 사용. 나는 여러 if 문을 사용하여 아래 일 것 같은
, 일반적인 기능을 쓰기는하지만 매우 추한됩니다 :

d7.dateRoundByHour <- function (.date, byHours) { 

    if (byHours == 1) 
    return (round.POSIXt(.date, "hour")) 

    hh = hour(.date); dd = mday(.date); mm = month(.date); yy = year(.date)  
    hh = round(hh/byHours,digits=0) * byHours 
    if (hh>=24) { 
    hh=0; dd=dd+1 
    } 
    if ((mm==2 & dd==28) | 
     (mm %in% c(1,3,5,7,8,10,12) & dd==31) | 
     (mm %in% c(2,4,6,9,11) & dd==30)) { # NB: it won't work on 29 Feb leap year. 
    dd=1; mm=mm+1 
    } 
    if (mm==13) { 
    mm=1; yy=yy+1 
    } 
    str = sprintf("%i-%02.0f-%02.0f %02.0f:%02.0f:%02.0f EDT", yy,mm,dd, hh,0,0) 
    as.POSIXct(str, format="%Y-%m-%d %H:%M:%S") 
} 

누구나 그렇게 할 수있는 더 좋은 방법을 보일 수 있는가?
(아마도 수치로 변환하여 다시 POSIXt 또는 일부 다른 기능 POSIXt? 행)

+1

패키지'highfrequency'는 원하는 결과를 제공해야하는'aggregatets()'래퍼를 가지고 있습니다 – Rime

답변

3

사용 lubridate 패키지에서 round_date 기능.

x <- as.POSIXct("2014-12-28 22:59:00 EDT") 
round_date(x, '2 hours') 
3

이 정말 실제로 :

dt[, date := round_date(date, '2 hours')] 

은 빠른 예를 들어 당신이 찾고 있던 정확하게 결과를 줄 것이다 : 당신은 당신이 다음을 수행 할 수있는 열 이름이 날짜와 data.table했다 가정 그냥 쉽게는 "이상한 많은"에 의해 R.에게 라운드에 대한 기본 개념을 기반으로하는 적절한 배율 인수는

  • 규모 내려
  • roun D 아래로
  • 규모 다시 다운 스케일 단위의 정수로

또는 두 개의 R 코드 문에서 다시 변환 :

R> pt <- as.POSIXct(c("2014-12-28 22:59:00", "2014-12-28 23:01:00 EDT")) 
R> pt # just to check 
[1] "2014-12-28 22:59:00 CST" "2014-12-28 23:01:00 CST" 
R> 
R> scalefactor <- 60*60*2 # 2 hours of 60 minutes times 60 seconds 
R> 
R> as.POSIXct(round(as.numeric(pt)/scalefactor) * scalefactor, origin="1970-01-01") 
[1] "2014-12-28 22:00:00 CST" "2014-12-29 00:00:00 CST" 
R> 

핵심 마지막 줄에 그냥 나와 무엇을합니까 : 변환하려면 POSIXct을 숫자로 표현한 다음 크기를 줄인 다음 다시 스케일링 한 다음 다시 POSIXct으로 변환하기 전에 반올림합니다.

관련 문제