如何在R中将时间长度转换为数字?

问题描述

我有一个数据框,其中包含完成一圈所需的时间,我正在尝试将其分成每个车手的单独数据框。

这些时间值看起来像这样,以分钟:秒.毫秒为单位,除了第一圈在秒和毫秒之间有一个冒号。

13:14:50 1:28.322 1:24.561 1:23.973 1:23.733 1:24.752

我想将这些以秒格式保存在一个单独的数据框中。

794.500 88.322 84.561 83.973 83.733 84.752

当我将其转换为数字时,它会给出以下值。

214 201 174 150 133 183

当我使用 strptimePOSIXlt 时,它给了我巨大的值,这些值也是错误的,即使我使用格式代码也是如此。但是,我减去了 2 个值以发现时差是正确的,并且通过该值我发现所有值都偏离了 1609164020。此外,这些值忽略了我需要的十进制值。

解决方法

您可以将 POSIXlt 与秒的转换结合使用。

首先,为您的第一个时间元素添加一个日期:

ds <- c("13:14:50","1:28.322","1:24.561","1:23.973","1:23.733","1:24.752")
ds[1] <- paste( Sys.Date(),ds[1] )
#[1] "2020-12-29 13:14:50" "1:28.322"            "1:24.561"           
#[4] "1:23.973"            "1:23.733"            "1:24.752"

创建一个函数将后续的minutes:seconds.milliseconds 转换为seconds.milliseconds

to_sec <- function(x){ as.numeric(sub( ":.*","",x )) * 60 +
  as.numeric( sub( ".*:",x ) ) }

将向量转换为启用时差计算的日期:

ds[2:6] <- to_sec(ds[2:6])
ds[2:6] <- cumsum(ds[2:6])

dv <- c( as.POSIXlt(ds[1]),as.POSIXlt(ds[1]) + as.numeric(ds[2:6]) )
# [1] "2020-12-29 13:14:50 CET" "2020-12-29 13:16:18 CET"
# [3] "2020-12-29 13:17:42 CET" "2020-12-29 13:19:06 CET"
# [5] "2020-12-29 13:20:30 CET" "2020-12-29 13:21:55 CET"

dv[6] - dv[1]
# Time difference of 7.089017 mins