从R中的时间数据中剥离秒数

时间:2012-08-14 14:58:59

标签: r

我有这样的数据

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

这些数据采用H:M:S格式。我希望能够将此数据转换为总秒数。我喜欢将H数据与H * 60 * 60 + M * 60 + S相乘以计算总秒数值。

我这样做:

z <- strptime(, "%H") 

获取小时值,不起作用。任何人都可以插话吗?

3 个答案:

答案 0 :(得分:4)

我从未使用过复杂的包装处理时间。这是一个代替它的oneliner。

> apply(sweep(sapply(strsplit(y, ":"), as.integer), 1, 60^(2:0), "*"), 2, sum)
[1]   10  610 7802

答案 1 :(得分:3)

你的小时数可以超过24小时吗?如果是这样,我认为你必须将它们视为字符串。同样在您的示例中,最后2在第三次2:10: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)
}

根据Carl的上述评论,使用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
> 

Hadley在period中创建的lubridate类型非常令人愉快,但需要稍微习惯。

答案 2 :(得分:3)

我参加派对有点晚了,但我认为这是一个很好的方法,因为它使用标准的时间函数而且很简单:

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

[1] 10 610 7802

注意:仅当您的数据是时钟时间时才适用。