2013-05-29 31 views
9

Rの日付を任意の精度でグループ化することを検討しています。Rの日付を任意の精度のレベルに丸める

これは、たとえば、を使用して、最も近い時または分にするのはかなり簡単です。 lubridate

library(lubridate) 
nearest_hour = floor_date(now(), 'hour') 

することはでき、グループなどで、このような日付のリスト簡単なsummariseddplyplyrから。

私がしたいのは、任意の精度の丸められた日付です。最寄りの15分または3時間ごとに:

nearest_three_hours = floor_date(now(), '3 hours') 

http://r.789695.n4.nabble.com/Truncating-dates-and-other-date-time-manipulations-td866901.htmlでこのようなことの議論がありますが、日付を切断の外に、任意の解像度となっているためにそこに表示されません。

ありがとうございました。

+2

あなたはその後、からサブセットに時間のベクトルを持っている場合[xts](http://cran.project.org/package=xts)の 'endpoints'関数を使うことができます:' library(xts); x < - .POSIXct(0)+1:10 * 60 * 60 ; x [endpoints(x、 "hours"、3)] ' – GSee

答えて

5

lubridateは、最も近い原子単位に既にフロアしています。あなたがしたい(丸められていない)と思う最も近い15分に床を得るためには、findIntervalと定義されたブレークポイントのセットを使って正しい範囲にマップする必要があります。このfloor_timeはfloor_dateと機能的には同じですが、秒、分、または時間単位の変数を指定することができます。

floor_time <- function(x, k = 1, unit = c("second", "minute", "hour", "day", 
              "week", "month", "year")) { 
    require(lubridate) 

    nmax <- NULL 

    switch(unit, second = {nmax <- 60}, 
     minute = {nmax <- 60}, 
     hour = {nmax <- 24}) 

    cuts <- seq(from = 0, to = nmax - 1, by = k) 
    new <- switch(unit, 
       second = update(x, seconds = cuts[findInterval(second(x), cuts)]), 
       minute = update(x, minutes = cuts[findInterval(minute(x), cuts)], 
           seconds = 0), 
       hour = update(x, hours = cuts[findInterval(hour(x), cuts)], 
           minutes = 0, seconds = 0), 
       day = update(x, hours = 0, minutes = 0, seconds = 0), 
       week = update(x, wdays = 1, hours = 0, minutes = 0, seconds = 0), 
       month = update(x, mdays = 1, hours = 0, minutes = 0, seconds = 0), 
       year = update(x, ydays = 1, hours = 0, minutes = 0, seconds = 0)) 

    new 
} 
5

あなたはこれを試すことができますが、まだコードがlubridateによく、すべてのトリッキーな状況のおかげで扱うlubridateライブラリ

library(lubridate) 
round_minute<-function(x,precision){ 
    m<-minute(x)+second(x)/60 
    m.r<- round(m/precision)*precision 
    minute(x)<-m.r 
    second(x)<-0 
    x 
} 

round_minute(ymd_hms(c("2013-06-03 22:53:00","2013-05-03 12:18:00","2013-05-03 00:10:00")),15) 

> "2013-06-03 23:00:00 UTC" "2013-05-03 12:15:00 UTC" "2013-05-03 00:15:00 UTC" 

に基づきます。もちろん、この関数は分単位で表現された精度に対してのみ機能しますが、他の単位にも簡単に拡張でき、本当に必要な場合はジェネリック関数を作成することもできます。

1

lubridateは今より一般的なround_date()機能を持っています。

lubridate::round_date(date, "5 mins") 
lubridate::round_date(date, "2 hours") 
1

少し遅れて、そして私がコメントする担当者を持っていないが、セルバが述べたように、lubridateは今、この機能を持っています

library(lubridate) 
round_date(now(), '3 hours') 
floor_date(now(), '3 hours') 
ceiling_date(now(), '3 hours') 
関連する問題