将专有的持续时间格式转换为毫秒

问题描述 投票:0回答:2

这里是持续时间格式的示例:

16984  = 16 second 984 milliseconds
214032 = 2 minutes 14 seconds, 032 milliseconds
1649871 = 16 minutes 49 seconds and 871 milliseconds

因此,看起来人类可读格式的持续时间格式为minutes:seconds:milliseconds

我编写了一个函数来对其进行转换,但我知道它并非万无一失。我知道字符串的长度最多为2

convert.to.ms <- function(str) {

  str <- as.numeric(str)

  ms <- c()
  ss <- c()
  min <- c()
  nchar(str)
  total.ms <-c()

  if(nchar(str) == 6) {

    ms  <- as.numeric(substr(str, nchar(str)-2, nchar(str)))

    ss  <- as.numeric(substr(str, nchar(str)-4, nchar(str)-3))

    min <- as.numeric(substr(str, 0, 1))
    total.ms <- (sum (ms + ss*1000 + min*60000))


  } else if(nchar(str) == 5) {

    ms  <- as.numeric(substr(str, nchar(str)-2, nchar(str)))

    ss  <- as.numeric(substr(str, nchar(str)-4, nchar(str)-3))
    total.ms <- (sum (ms + ss*1000))
  }
  total.ms
}

我尝试使用lubridate无济于事

r time data-science iso8601
2个回答
2
投票

拥抱您输入的数字

prop.time.format.to.milliseconds <- function(ptf) {
    ms <- as.numeric(ptf) %% 1000
    ss <- floor(as.numeric(ptf)/1000) %% 100
    mm <- floor(as.numeric(ptf)/100000)
    mm*60000 + ss*1000 + ms
}

1
投票

使用末尾注解中显示的输入tt

60 * 1000 * (tt %/% 100000) + 1000 * (tt %/% 1000 %% 100) + (tt %% 1000)
## [1]   16984  134032 1009871

注意

我们假设输入是:

tt <- c(16984, 214032, 1649871)

0
投票

我们可以肯定的是,组件是从右向左读取的。也就是说,最右边的1-3位数字表示毫秒,接下来的1-2位数字表示秒,其余的数字(如果存在)表示分钟。

您必须做的是通过用零填充到左边来标准化您的字符串。这样,您可以应用一种一刀切的逻辑,您的代码将变得更加简单。

convert.to.ms <- function(str) {
  str <- paste0(strrep('0', 8 - nchar(str)), str)
  min <- substring(str, 1, 3)
  ss <- substring(str, 4, 5)
  ms <- substring(str, 6, 8)

  total.ms <- as.numeric(min) * 60000 + as.numeric(ss) * 1000 + as.numeric(ms)

  total.ms
}

上面的代码将参数作为字符串处理。另一种方法是将其视为数字,然后使用除法和余数提取值,如下所示。

convert.to.ms <- function(str) {
  value <- as.numeric(str)

  ms <- value %% 1000
  value <- value %/% 1000

  ss <- value %% 100
  value <- value %/% 100

  min <- value

  total.ms <- min * 60000 + ss * 1000 + ms

  total.ms
}
© www.soinside.com 2019 - 2024. All rights reserved.