用subseconds解析时间数据

时间:2017-08-28 19:06:51

标签: r time lubridate

我有一些时间数据

01:09:00
00:14:00
00:00:00
11:47:00
10:34:00
08:15:00

数据以%M:%S:00计算(第一个数字是分钟,第二个数字是秒)。我想将其转换为总秒数。使用lubridate很容易,但R一直认为格式在%H:%M:%S

可以使用lubridate计算我的数据格式所用的总秒数吗?如果没有,那么将数据转换为适当格式的最佳方法是什么?

我已经考虑过转换为角色,只是拼出分钟和秒钟。

3 个答案:

答案 0 :(得分:1)

library(lubridate)
foo = function(x){
    hms(sapply(strsplit(x, ":"), function(xx) paste("01", xx[1], xx[2], sep = ":")))
}
a = "01:09:00"
b = "00:14:00"
foo(a) - foo(b)
#[1] "1M -5S"

#OR
as.period(foo(a) - foo(b), unit = "secs")
#[1] "55S"

答案 1 :(得分:0)

以下可能会这样做。

NumSeconds <- function(x){
    f <- function(y)
        sum(sapply(strsplit(y, split=":"), as.numeric) * c(60, 1, 0))
    unname(sapply(x, f))
}

x <- scan(what = "character", text = "
01:09:00
00:14:00
00:00:00
11:47:00
10:34:00
08:15:00")

NumSeconds(x)
[1]  69  14   0 707 634 495

答案 2 :(得分:0)

您可以使用data.table::as.ITime并将格式指定为"%M:%S" *:

x <- c("01:09:00", "10:34:00")
as.integer(as.ITime(x, format = "%M:%S"))
# [1]  69 634

* format参数传递给strptime和...

  

每个输入字符串都会根据指定的格式进行处理:忽略任何尾随字符。   [...]   请注意,%S不会读取输出中的小数部分。

或者,很可能更快,substr

as.integer(substr(x, 1, 2)) * 60 + as.integer(substr(x, 4, 5))
# [1]  69 634