私はこのようなデータを持っています
y<-c("00:00:10", "00:10:10", "2:10:2")
これらのデータは H:M:S 形式です。このデータを合計秒数に変換できるようにしたいと思います。H データに H*60*60 + M*60 + S を掛けて合計秒数を計算するのが好きです。
私はこれをしていました:
z <- strptime(, "%H")
時間の値を取得するには、機能しません。誰でも参加できますか?
私はこのようなデータを持っています
y<-c("00:00:10", "00:10:10", "2:10:2")
これらのデータは H:M:S 形式です。このデータを合計秒数に変換できるようにしたいと思います。H データに H*60*60 + M*60 + S を掛けて合計秒数を計算するのが好きです。
私はこれをしていました:
z <- strptime(, "%H")
時間の値を取得するには、機能しません。誰でも参加できますか?
洗練されたパッケージで時間を処理するコツをつかんだことはありません。これが代わりにそれを行うワンライナーです。
> apply(sweep(sapply(strsplit(y, ":"), as.integer), 1, 60^(2:0), "*"), 2, sum)
[1] 10 610 7802
私はパーティーに少し遅れましたが、標準の時間関数を使用し、非常にシンプルであるため、良い方法だと思います。
as.integer(as.POSIXct(y,format="%H:%M:%S",tz="GMT")) %% (60*60*24)
[1] 10 610 7802
注: これは、データがクロック タイムである場合にのみ適用されます。
あなたの勤務時間は 24 を超えますか? もしそうなら、これらを文字列として扱う必要があると思います。また、あなたの例では、3回目の最後の2
意味は何2:10:2
ですか? それは 2 秒ですか、それとも 20 秒ですか。
これらの 2 つの関数を使用して、前後に変換します。
convertSecToHrMinSec <- function(vec) {
# takes a vector of seconds
# returns string formatted as HHH:MM:SS
vec <- as.integer(vec)
hr <- floor(vec / 3600)
min <- floor((vec - hr * 3600) / 60)
sec <- vec - min * 60 - hr * 3600
hr <- sprintf('%02d', hr)
min <- sprintf('%02d', min)
sec <- sprintf('%02d', sec)
return (paste(hr, min, sec, sep=':'))
}
convertHrMinSecToSec <- function(vec) {
## convert hrs:mins:seconds to seconds
require(stringr)
require(plyr)
if (length(grep('.+/.+:.+', vec, perl=TRUE)) >= 1) return(vec)
if (length(grep('.+:.+:.+', vec, perl=TRUE)) >= 1) {
vec <- laply(str_split(vec, ':'), function(x) as.integer(x[1]) * 3600 + as.integer(x[2]) * 60 + as.integer(x[3]))
}
return (vec)
}
上記を使用したカールのコメントによるとlubridate
:
library(lubridate)
hms(y)
[1] 10 seconds 10 minutes and 10 seconds 2 hours, 10 minutes and 2 seconds
そして、適切な測定のために:
> str(hms(y))
Formal class 'Period' [package "lubridate"] with 6 slots
..@ .Data : num [1:3] 10 10 2
..@ year : num [1:3] 0 0 0
..@ month : num [1:3] 0 0 0
..@ day : num [1:3] 0 0 0
..@ hour : num [1:3] 0 0 2
..@ minute: num [1:3] 0 10 10
>
period
Hadley が作成したタイプはlubridate
非常に使いやすいですが、少し慣れが必要です。