如何将时间(而非日期时间)变量转换为数字?

时间:2019-06-27 00:59:59

标签: r

我有一个游泳时间的数据,我希望能够随着时间推移进行绘制。我想知道是否有一种快速的方法可以将这些变量从字符更改为数字?

我首先尝试将时间转换为POSIX日期时间格式,但事实证明这没有帮助,尤其是因为我想对数据做一些ARIMA预测。

这是我的数据

times <- c("47.45","47.69",  
           "47.69","47.82",  
           "47.84","47.92",  
           "47.96","48.13",  
           "48.16","48.16",  
           "48.16","48.31",  
           "49.01","49.27",  
           "49.33","49.40",  
           "49.48","49.51",  
           "52.85","52.89",  
           "53.14","54.31",  
           "54.63","56.91",  
           "1:18.39","1:20.26",
           "1:38.30")

dates <- c("2017-02-24 MST",
           "2017-02-24 MST",
           "2016-02-26 MST",
           "2018-02-23 MST",
           "2015-12-04 MST",
           "2015-03-06 MST",
           "2015-03-06 MST",
           "2016-12-02 MST",
           "2016-02-26 MST",
           "2017-11-17 MST",
           "2016-12-02 MST",
           "2017-11-17 MST",
           "2014-11-22 MST",
           "2017-01-13 MST",
           "2017-01-21 MST",
           "2015-10-17 MDT",
           "2017-01-27 MST",
           "2016-01-29 MST",
           "2017-10-20 MDT",
           "2016-11-05 MDT",
           "2015-11-07 MST",
           "2015-10-30 MDT",
           "2014-11-22 MST",
           "2016-11-11 MST",
           "2014-02-28 MST",
           "2014-02-28 MST",
           "2014-02-28 MST",)

df <- cbind(as.data.frame(dates),as.data.frame(times))

我希望能获得一列时间,可能以秒为单位,因此前24个观察点将保持不变,但后3个观察点将变为78.39、80.26和98.30

3 个答案:

答案 0 :(得分:3)

一种方法是在没有分钟的时间之前加上“ 00:”。

然后,您可以使用lubridate::ms进行时间转换。

library(dplyr)
library(lubridate)

data.frame(times = times,
           stringsAsFactors = FALSE) %>% 
  mutate(times2 = ifelse(grepl(":", times), times, paste0("00:", times)), 
         seconds = as.numeric(ms(times2)))

结果:

     times   times2 seconds
1    47.45 00:47.45   47.45
2    47.69 00:47.69   47.69
3    47.69 00:47.69   47.69
4    47.82 00:47.82   47.82
5    47.84 00:47.84   47.84
6    47.92 00:47.92   47.92
7    47.96 00:47.96   47.96
8    48.13 00:48.13   48.13
9    48.16 00:48.16   48.16
10   48.16 00:48.16   48.16
11   48.16 00:48.16   48.16
12   48.31 00:48.31   48.31
13   49.01 00:49.01   49.01
14   49.27 00:49.27   49.27
15   49.33 00:49.33   49.33
16   49.40 00:49.40   49.40
17   49.48 00:49.48   49.48
18   49.51 00:49.51   49.51
19   52.85 00:52.85   52.85
20   52.89 00:52.89   52.89
21   53.14 00:53.14   53.14
22   54.31 00:54.31   54.31
23   54.63 00:54.63   54.63
24   56.91 00:56.91   56.91
25 1:18.39  1:18.39   78.39
26 1:20.26  1:20.26   80.26
27 1:38.30  1:38.30   98.30

答案 1 :(得分:2)

as.difftime和一个快速的正则表达式可以在不显示分钟时添加分钟,应该处理它:

as.difftime(sub("(^\\d{1,2}\\.)", "0:\\1", times), format="%M:%OS")
#Time differences in secs
# [1] 47.45 47.69 47.69 47.82 47.84 47.92 47.96 48.13 48.16 48.16 48.16 48.31
#[13] 49.01 49.27 49.33 49.40 49.48 49.51 52.85 52.89 53.14 54.31 54.63 56.91
#[25] 78.39 80.26 98.30

答案 2 :(得分:1)

您可以在Tidyverse tidyr包中使用单独的字符串将字符串分为分钟和秒:

library(tidyr)
library(dplyr)

separate(tibble(times = times), times, sep = ":",
         into = c("min", "sec"), fill = "left", convert = T) %>%
  mutate(min = ifelse(is.na(min), 0, min),
         seconds = 60 * min + sec)

# A tibble: 27 x 3
     min   sec seconds
   <dbl> <dbl>   <dbl>
 1     0  47.4    47.4
 2     0  47.7    47.7
 3     0  47.7    47.7
 4     0  47.8    47.8
 5     0  47.8    47.8
 6     0  47.9    47.9
 7     0  48.0    48.0
 8     0  48.1    48.1
 9     0  48.2    48.2
10     0  48.2    48.2
# ... with 17 more rows

新列秒数是秒数,即分钟数乘以60。