计算R

时间:2016-09-07 10:25:56

标签: r time

我目前正在努力研究R并计算时间差。

我有大约60 000行的data.frame。在这个数据框中有两列名为" start"和"结束"。两列都包含UNIX时间格式的数据,以毫秒为单位 - 正如您可以通过最后三位数看到的那样。

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

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

d <- data.frame(Start, End)

我想要的输出应该是一个名为timediff的额外列,其中时间差以天为单位。

我用timediff和strptime尝试过,我在这里找到了。但没有成功。 也许你们中的一个人曾经在计算过去的时差。 非常感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"))