2016-09-07 3 views
0

В настоящее время я борюсь с R и вычисляет разницу во времени в днях.Вычислить разницу во времени в R

У меня есть data.frame около 60 000 рядов. В этом фрейме данных есть два столбца, называемых «start» и «end». Оба столбца содержат данные в формате UNIX во времени с миллисекундами - как вы можете видеть по последним трем цифрам.

Start <- c("1470581434000", "1470784954000", "1470811368000", "1470764345000") 

End <- c("1470560601000", "1470581549000", "1470785452000", "1470764722000") 

d <- data.frame(Start, End) 

Мой желаемый результат должен быть дополнительным столбцом, называемым timediff, где разница во времени составляет контуры в днях.

Я попробовал это с timediff и strptime, которые я нашел здесь. Но ничего не получилось. Возможно, один из вас работал с расчетом временных разниц в прошлом. Большое спасибо

ответ

0

У вас есть несколько шагов, которые вы должны будете принять:

# 1. Separate the milliseconds. 
# To do this, insert a period in front of the last three digits 

Start <- 
    sub(pattern = "(\\d{3}$)", # get the pattern of three digits at the end of the string 
     replacement = ".\\1", # replace with a . and then the pattern 
     x = Start) 

# 2. Convert to numeric 
Start <- as.numeric(Start) 

# 3. Convert to POSIXct 
Start <- as.POSIXct(Start, 
        origin = "1970-01-01") 

Для удобства было бы хорошо, чтобы поместить их все в функцию

# Bundle all three steps into one function 
unixtime_to_posixct <- function(x) 
{ 
    x <- sub(pattern = "(\\d{3}$)", 
      replacement = ".\\1", 
      x = x) 
    x <- as.numeric(x) 
    as.POSIXct(x, 
      origin = "1970-01-01") 
} 

И с что вы можете получить свои разницы в днях

#* Put it all together. 
library(dplyr) 
library(magrittr) 

Start <- c("1470581434000", "1470784954000", "1470811368000", "1470764345000") 

End <- c("1470560601000", "1470581549000", "1470785452000", "1470764722000") 

d <- data.frame(Start, 
       End, 
       stringsAsFactors = FALSE) 

lapply(
    X = d, 
    FUN = unixtime_to_posixct 
) %>% 
    as.data.frame() %>% 
    mutate(diff = difftime(Start, End, units = "days")) 
3

Существует очень маленькое и быстрое решение:

Start_POSIX <- as.POSIXct(as.numeric(Start)/1000, origin="1970-01-01") 
End_POSIX <- as.POSIXct(as.numeric(End)/1000, origin="1970-01-01") 
difftime(Start_POSIX, End_POSIX) 

Time differences in mins 
[1] 347.216667 3390.083333 431.933333 -6.283333 

или если вы хотите другой блок:

difftime(Start_POSIX, End_POSIX, unit = "sec") 

Time differences in secs 
[1] 20833 203405 25916 -377 
Смежные вопросы