将以秒为单位的时间转换为小时:分钟:秒

时间:2019-08-26 15:58:03

标签: r datetime

我目前正在处理有关超级马拉松的数据。在该检查点上,每个跑步者的时间都有很多带有时间戳的检查点,但是当我尝试研究分段时间时,我需要计算一半的时间,这本身不是问题,但是在格式化方面存在问题。 / p>

我抓取的数据如下:

# A tibble: 397 x 15
   General Name  `12`     `1`    `2`    `3`      `4`      `5`      `6`      `7`      `8`      `9`      `10`     `11`    
     <dbl> <chr> <time>   <time> <time> <time>   <time>   <time>   <time>   <time>   <time>   <time>   <time>   <time>  
 1       2 Chri… 10:02:17 00'00" 56'27" 01:36:58 03:23:54 05:05:31 05:53:18 06:17:25 06:54:33 07:33:36 08:22:16 08:55:23
 2       3 Nico… 10:14:57 00'00" 55'47" 01:35:28 03:22:24 05:16:22 06:09:51 06:33:52 07:11:12 07:50:28 08:38:20 09:10:06
 3       4 Maxi… 10:32:46 00'00" 55'42" 01:35:08 03:23:01 05:13:12 06:06:35 06:32:58 07:13:10 07:58:11 08:47:50 09:22:07
 4       5 Diog… 10:42:56 00'00" 58'50" 01:42:46 03:34:29 05:36:03 06:29:57 06:54:23 07:35:31 08:14:50 09:03:12 09:38:53
 5       6 Migu… 10:44:52 00'00" 56'27" 01:38:00 03:23:53 05:15:39 06:10:39 06:37:54 07:22:36 08:04:20 08:58:35 09:38:21
 6       7 Jero… 10:52:52 00'00" 55'47" 01:35:06 03:21:35 05:20:53 06:16:44 06:43:40 07:24:17 08:11:34 09:03:10 09:37:00
 7       8 Aroa… 10:55:36 00'00" 59'28" 01:44:40 03:40:16 05:38:53 06:33:51 07:01:58 07:44:36 08:27:52 09:17:12 09:49:58
 8       9 Didi… 10:59:40 00'00" 59'28" 01:47:58 03:44:40 05:44:27 06:38:32 07:03:09 07:45:02 08:26:12 09:17:07 09:52:00
 9      10 Ales… 11:01:28 00'00" 56'50" 01:37:40 03:28:33 05:20:52 06:15:39 06:42:38 07:27:43 08:07:42 09:01:04 09:43:31
10      11 Davi… 11:02:49 00'00" 57'08" 01:38:15 03:28:47 05:19:02 06:13:10 06:40:44 07:24:51 08:09:10 09:06:07 09:45:14

(当前的时间戳格式是我要保留的格式。)

我认为问题在于数字舍入,因为我这样做是计算半场时间:

miut_joined <- miut_joined %>%
  drop_na() %>%
  mutate(`6.5` = (`5`+((`6`-`5`)/5.6)*2.5))

(5.6和2.5是现有检查点之间以及这两个检查点中的第一个和一半标记之间的特定距离。) 结果并不总是以整数形式出现。

当我这样做时,我得到的数据如下:

 miut_melted %>% select(-Name) %>% filter(Checkpoint == 6.5)
# A tibble: 397 x 3
   General Checkpoint  Time
     <dbl> <chr>      <dbl>
 1       2 6.5        19611
 2       3 6.5        20417
 3       4 6.5        20222
 4       5 6.5        21608
 5       6 6.5        20414
 6       7 6.5        20751
 7       8 6.5        21806
 8       9 6.5        22117
 9      10 6.5        20720
10      11 6.5        20592
# … with 387 more rows

我尝试使用lubridate::seconds_to_period,但是结果数据在ggplot2上效果不好。

我如何正确地将以秒为单位的时间转换为Hours:Minutes:Seconds?

2 个答案:

答案 0 :(得分:2)

您可以使用lubridate软件包:

total_secs <- 100000
new_time <- seconds_to_period(total_secs)
sprintf('%02d:%02d:%02d', new_time@hour, minute(new_time), second(new_time))
# [1] "03:46:40"

答案 1 :(得分:1)

如果问题是取代表秒的数字矢量并将其分别转换为HH:MM:SS,则可以使用chron times类。它在内部将时间表示为一天的一部分,因此:

library(chron)

secs <- c(100, 60, 30) # test input

tt <- times(secs / (24 * 60 * 60))
tt
## [1] 00:01:40 00:01:00 00:00:30

format(tt)
## [1] "00:01:40" "00:01:00" "00:00:30"

hours(tt)
## [1] 0 0 0

minutes(tt)
## [1] 1 1 0

seconds(tt)
## [1] 40  0 30

# add 30 seconds to each time
tt + times("00:00:30")
## [1] 00:02:10 00:01:30 00:01:00

# calculate differences in seconds, tt[i] - tt[i-1] for i = 2, 3, ...
24 * 60 * 60 * diff(tt)
## [1] -40 -30