Подтвердить что ты не робот

Преобразовать символ во времени в R

В следующем фрейме данных столбец "время" character

id<-c(1,2,3,4)
time<-c("00:00:01","01:02:00","09:30:01","14:15:25")
df<-data.frame(id,time)

Интересно, как я могу преобразовать его в time, чтобы я мог выполнять арифметические вычисления на нем.

4b9b3361

Ответ 1

Используйте функцию chron в пакете chron:

time<-c("00:00:01", "01:02:00", "09:30:01", "14:15:25")

library(chron)
x <- chron(times=time)

x
[1] 00:00:01 01:02:00 09:30:01 14:15:25

Сделайте некоторые полезные вещи, такие как вычисление разницы между последовательными элементами:

diff(x)
[1] 01:01:59 08:28:01 04:45:24

chron объекты хранят значения внутренне как долю секунд в день. Таким образом, 1 секунда эквивалентна 1/(60*60*24), или 1/86400, т.е. 1.157407e-05.

Итак, чтобы добавить время, один простой вариант:

x + 1/86400
[1] 00:00:02 01:02:01 09:30:02 14:15:26

Ответ 2

Используя базу R, вы можете преобразовать ее в объект класса POSIXct, но это добавляет дату к времени:

id<-c(1,2,3,4)
time<-c("00:00:01","01:02:00","09:30:01","14:15:25")
df<-data.frame(id,time,stringsAsFactors=FALSE)

as.POSIXct(df$time,format="%H:%M:%S")
[1] "2012-08-20 00:00:01 CEST" "2012-08-20 01:02:00 CEST"
[3] "2012-08-20 09:30:01 CEST" "2012-08-20 14:15:25 CEST"

Но это позволяет выполнять на них арифметические вычисления.

Ответ 3

Другой возможной альтернативой может быть:

time <- c("00:00:01","01:02:00","09:30:01","14:15:25")
converted.time <- as.difftime(time, units = "mins") #"difftime" class
secss <- as.numeric(converted.time, units = "secs")
hourss <- as.numeric(converted.time, units = "hours")
dayss <- as.numeric(converted.time, units="days")

Или даже:

w <- strptime(x = time, format = "%H:%M:%S") #"POSIXlt" "POSIXt" class

Ответ 4

Еще одна альтернатива, использующая пакет hms.

id <- c(1, 2, 3, 4)
time <- c("00:00:01", "01:02:00", "09:30:01", "14:15:25")
df <- data.frame(id, time, stringsAsFactors = FALSE)

Преобразование time столбца в класс hms

# install.packages("hms")
library(hms)
df$time <- as.hms(df$time)

Выполнение арифметических вычислений

diff(df$time)
#01:01:59
#08:28:01
#04:45:24