17

私は時間のベクトルを持っています。例えば:

vec.hours <- c("15:52:00", "15:56:00", "12:10:00", "15:12:00",  "11:49:00" ,"13:35:00", "14:53:00")

このように、時間を四捨五入して、5 分に最も近い新しい時間を取得したいと思います。

round.hours <- c("15:50:00", "16:00:00", "12:10:00", "15:10:00",  "11:50:00" ,"13:35:00", "14:55:00" )

私はこれを試しました

hour <- strptime(vec.hours , "%H:%M:%S")
round.hour <- round(hour , "mins")

しかし、それは機能していません。

各 round.hours の後、たとえば次のように +/- 1 時間を実行します。

hour.rd <- strptime(round.hours[1] , "%H:%M:%S")
hourM <- hour.rd - 3600
hourP <- hour.rd + 3600
l.tm <- timeSequence(from = hourM, to = hourP,format = "%H-%S-%M",by="5 min",FinCenter = "Europe/Zurich")

したがって、15:50:00 の場合、14:50 から 16:50 までの時間のベクトルがあります。

vec.hours から round.hour を取得する方法がわかりません。

どうもありがとう

4

4 に答える 4

10

時間をdatetimeオブジェクトに入れ、これらをに変換しPOSIXltます。これにより、分に整数としてアクセスし、整数除算を使用して丸め、時間を再度抽出できます。

timestamps <- as.POSIXlt(as.POSIXct('1900-1-1', tz='UTC') + as.difftime(vec.hours))
timestamps$min <- (timestamps$min + 5/2) %/% 5 * 5
format(timestamps, format='%H:%M:%S')
# [1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00"
于 2013-06-14T12:47:57.877 に答える
2

xts使用できるパッケージからalign.time

# align to next whole 5 min interval
align.time(hour, 5*60)
[1] "2013-06-14 15:55:00 CEST" "2013-06-14 16:00:00 CEST" "2013-06-14 12:15:00 CEST" "2013-06-14 15:15:00 CEST"
[5] "2013-06-14 11:50:00 CEST" "2013-06-14 13:40:00 CEST" "2013-06-14 14:55:00 CEST"

これにより、タイムスタンプが次の期間の開始に変更されます。これは、最も近い期間に開始される OP とは少し異なります。

于 2013-06-14T13:01:58.843 に答える
1

ここでの回答に基づく別の方法- 300 (5 分 * 60 秒) で割った後に丸め、結果に 300 を掛けます。

format(as.POSIXlt(as.POSIXct('2000-1-1', "UTC") + 
                    round(as.numeric(hours)/300)*300), 
       format = "%H:%M:%S")

#[1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00"
于 2013-06-14T13:04:19.513 に答える