2

私はこのようなデータを持っています

y<-c("00:00:10", "00:10:10", "2:10:2")

これらのデータは H:M:S 形式です。このデータを合計秒数に変換できるようにしたいと思います。H データに H*60*60 + M*60 + S を掛けて合計秒数を計算するのが好きです。

私はこれをしていました:

z <- strptime(, "%H") 

時間の値を取得するには、機能しません。誰でも参加できますか?

4

3 に答える 3

4

洗練されたパッケージで時間を処理するコツをつかんだことはありません。これが代わりにそれを行うワンライナーです。

> apply(sweep(sapply(strsplit(y, ":"), as.integer), 1, 60^(2:0), "*"), 2, sum)
[1]   10  610 7802
于 2012-08-14T17:31:16.800 に答える
3

私はパーティーに少し遅れましたが、標準の時間関数を使用し、非常にシンプルであるため、良い方法だと思います。

as.integer(as.POSIXct(y,format="%H:%M:%S",tz="GMT")) %% (60*60*24)

[1] 10 610 7802

注: これは、データがクロック タイムである場合にのみ適用されます。

于 2012-08-14T18:03:40.667 に答える
3

あなたの勤務時間は 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
> 

periodHadley が作成したタイプはlubridate非常に使いやすいですが、少し慣れが必要です。

于 2012-08-14T15:04:20.457 に答える