【问题标题】:How to convert length of time to numeric in R?如何将时间长度转换为R中的数字?
【发布时间】:2020-12-28 23:31:21
【问题描述】:

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

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

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 关闭了。此外,这些值忽略了我需要的十进制值。

【问题讨论】:

  • 没有回答你的问题,但我认为你对第一个条目的解释是错误的。这看起来更像是一个时间而不是一个持续时间。毫秒有 3 位数吗?
  • 您能否提供一个可重现的数据示例。请参阅how to give a reproducible example。另外,您真的需要单独数据框中的输出吗?那么每个数据帧中只有 1 个值?

标签: r strptime posixlt


【解决方案1】:

您可以将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多