【问题标题】:Calculate time difference between two events (given date and time) in R计算R中两个事件(给定日期和时间)之间的时间差
【发布时间】:2015-01-23 17:48:06
【问题描述】:

我目前正在努力解决有关计算两个事件之间时间差的初学者问题。

我想考虑包含日期和时间(一列中的两个值)的列,并计算与具有相同 ID(A或本例中的 B)。

ID = c("A", "A", "B", "B")
time = c("08.09.2014 10:34","12.09.2014 09:33","13.08.2014 15:52","11.09.2014 02:30")
d = data.frame(ID,time)

我想要的输出格式为小时:分钟

time difference = c("94:59","94:59","682:38","682:38")

Days:Hours:Minutes 或任何类似的格式也可以使用,只要它可以方便地实现。我对输出的格式很灵活,以上只是我想到的一个想法。

对于每个单独的 ID,我总是有两行(在示例中为 2xA 和 2xB)。我没有一个令人信服的想法如何避免重复差异。

我之前尝试过一些示例,这些示例是在 stackoverflow 上找到的。他们中的大多数人使用POSIXtstrptime。但是,我没有设法将这些想法应用到我的数据集中。

【问题讨论】:

  • d$time <- strptime(d$time, "%d.%m.%Y %H:%M") to make that column a POSIXlt class

标签: r posixct strptime


【解决方案1】:

这是我使用dplyr的尝试

library(dplyr)
d %>%
  mutate(time = as.POSIXct(time, format = "%d.%m.%Y %H:%M")) %>%
  group_by(ID) %>%
  mutate(diff = paste0(gsub("[.].*", "", diff(time)*24), ":",
                       round(as.numeric(gsub(".*[.]", ".", diff(time)*24))*60)))


# Source: local data frame [4 x 3]
# Groups: ID
# 
#   ID                time   diff
# 1  A 2014-09-08 10:34:00  94:59
# 2  A 2014-09-12 09:33:00  94:59
# 3  B 2014-08-13 15:52:00 682:38
# 4  B 2014-09-11 02:30:00 682:38

【讨论】:

    【解决方案2】:

    一个非常(对我来说)hack-ish 的基本解决方案:

    ID <- c("A", "A", "B", "B")
    time <- c("08.09.2014 10:34", "12.09.2014 09:33", "13.08.2014 15:52","11.09.2014 02:30")
    d <- data.frame(ID, time)
    
    d$time <- as.POSIXct(d$time, format="%d.%m.%Y %H:%M")
    
    unlist(unname(lapply(split(d, d$ID), function(d) {
      sapply(abs(diff(c(d$time[2], d$time))), function(x) {
        sprintf("%s:%s", round(((x*24)%/%1)), round(((x*24)%%1 *60)))
      }) 
    })))
    
    ## [1] "94:59"  "94:59"  "682:38" "682:38"
    

    我不得不相信这个函数已经存在于某个地方了。

    【讨论】:

      【解决方案3】:

      类似于 David 和 hrmbrmstr 的尝试,我发现使用 difftime 的这个解决方案有效

      我使用在 stackoverflow 上找到的 rowshift 脚本

      rowShift <- function(x, shiftLen = 1L) {
         r <- (1L + shiftLen):(length(x) + shiftLen)
         r[r<1] <- NA
         return(x[r])
      }
      d$time.c <- as.POSIXct(d$time, format = "%d.%m.%Y %H:%M")
      d$time.prev <- rowShift(d$time.c,-1)
      d$diff <- difftime(d$time.c,d$time.prev, units="hours")
      

      d$diff 的每一行在结果中都有正/负值。我确实删除了所有具有负值的行,并且每个 ID 的第一次和最后一次之间存在差异。

      【讨论】:

      • difftime 与我使用的 diff 和 hrbrmstr 相同。 diff 是一个通用函数,如果获取 POSIXct 类的对象,则使用 difftime
      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2011-08-01
      • 1970-01-01
      • 2017-05-21
      • 2021-12-19
      • 2021-10-09
      • 2021-08-14
      相关资源
      最近更新 更多