【问题标题】:Formatting a duration as HH:mm:ss in R [duplicate]在R中将持续时间格式化为HH:mm:ss [重复]
【发布时间】:2022-01-14 00:18:19
【问题描述】:

如果这是一个重复的问题,请原谅我,但我似乎无法输入完美的搜索来获得我需要的内容。我想将秒(作为数字)转换为 HH:mm:ss 格式的持续时间。

下面是一个带有原始值和期望值的数据框。

df <- data.frame(Duration = c(19, 250, 3, 3600), Expected = c("00:00:19", "00:04:10", "00:00:03", "01:00:00"))

【问题讨论】:

标签: r datetime


【解决方案1】:

这会使用as.POSIXct 构建一个日期对象并添加持续时间,然后使用strftime 将输出截断为时间。如果计数高于 24 小时,则重置为 00:00:00。如需更高的数字,请参阅底部的方法。

df
  Duration
1       19
2      250
3        3
4     3600

df$Expected <- strftime(as.POSIXct("00:00:00", format="%H:%M:%S") + 
                        df$Duration, format="%H:%M:%S")

df
  Duration Expected
1       19 00:00:19
2      250 00:04:10
3        3 00:00:03
4     3600 01:00:00

如果您需要计数超过一天,请使用此

df
  Duration
1       19
2      250
3        3
4     3600
5   431170

df$Expected <- paste0(sprintf("%02.f",floor(df$Duration/3600)),":",
                      sprintf("%02.f",(df$Duration/60)%%60),":",
                      sprintf("%02.f",df$Duration%%60))

df
  Duration  Expected
1       19  00:00:19
2      250  00:04:10
3        3  00:00:03
4     3600  01:00:00
5   431170 119:46:10

【讨论】:

  • 这将从 86400 秒 = 24 小时重新开始
  • @BrianMontgomery 是的,没错,谢谢!添加了可供 OP 选择的替代方法!
【解决方案2】:

另一个使用lubridatehms 的答案:

library(lubridate)
library(hms)

df <- data.frame(Duration = c(19, 250, 3, 3600, 86401))
df$Expected <- hms::hms(seconds_to_period(df$Duration))

df
  Duration Expected
1       19 00:00:19
2      250 00:04:10
3        3 00:00:03
4     3600 01:00:00
5    86401 24:00:01

【讨论】:

    【解决方案3】:

    我们可以将duration 列视为自纪元以来的秒数,并使用format 从中提取时间分量。

    基本 R 方法 -

    format(as.POSIXct(df$Duration, origin = '1970-01-01', tz = 'UTC'), '%T')
    #[1] "00:00:19" "00:04:10" "00:00:03" "01:00:00"
    

    【讨论】:

    • 这将从 86400 秒 = 24 小时重新开始
    【解决方案4】:

    为此我写了一个小函数:

    hms <- function(s) {
      s <- as.integer(s)
      sprintf('%02i:%02i:%02i', s %/% 3600, s %/% 60 %% 60, s %% 60)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多