有没有办法在 R 中获取时差(日期戳不一致)?

Is there a way to take the time difference in R (with inconsistent datestamp)?

我想知道是否有人知道如何解决这个问题。 我有一个包含以下列的数据框:Startime、Endtime 和 ID(下面的数据框)我已经对 ID 进行了分组。我试图找出特定“分组依据”ID(特别是 A)的时差(以秒为单位)

Starttime                   Endtime                    ID

12/18/2019 4:06:59 PM       12/18/2019 4:07:05 PM       A
12/18/2019 4:07:26 PM       12/18/2019 4:07:28 PM       A
12/17/2019 6:48:06 PM       12/17/2019 6:48:07 PM       A
12/17/2019 6:25:16 PM       12/17/2019 6:25:22 PM       A

我通过在 R 中使用以下代码并利用 dplyr 包来解决这个问题:

data <-rawdata %>% group_by(ID) %>% 
       summarize(diff = difftime(last(as.POSIXct(Endtime, format ="%m/%d/%Y %I:%M:%S %p")), 
          first(as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" )), units = "secs"))

但是,上面的代码只计算开始时间和结束时间之间的差异,而不计算两者之间的差异。例如,上面的代码计算:

12/18/2019 4:06:59 PM and 12/17/2019 6:25:22 PM

我认为这是不准确的,因为它没有考虑 12/17 何时更改为 12/18,它只是采用分组 ID 中的第一个和最后一个值。

有没有办法在已经分组的数据中对数据进行分组? (进一步按时间分组:月日和年,然后以秒为单位计算差异?

有办法吗?进一步对数据进行分组,这样当日期发生变化时,它也会知道计算此差异,而不是只计算第一个和最后一个值。

 Starttime                Endtime                          ID
 12/18/2019 4:06:59PM     12/18/2019 4:07:05 PM             A
 12/18/2019 4:07:26PM     12/18/2019 4:07:28 PM             A
 12/17/2019 6:48:06PM     12/17/2019 6:48:07PM              A
 12/17/2019 6:25:16PM     12/17/2019 6:25:22PM              A

任何建议都会有所帮助!我觉得我被困在这上面了。我会继续研究。谢谢!

******编辑澄清******

我正在计算我的电子邮件持续时间。在这个例子中,我已经按 ID 分组了。

我想为 ID 'A' 计算我的电子邮件阅读持续时间。我目前使用的代码只是以秒为单位计算它的开始和结束时间。

data <-rawdata %>% group_by(ID) %>% summarize(diff = difftime(last(as.POSIXct(结束时间,格式= "%m/%d/%Y %I:%M:%S %p")),first(as.POSIXct(开始时间, 格式 = "%m/%d/%Y %I:%M: %S %p" )), 单位 = "secs"))

不过,我认为这并不准确。总的来说,我想要每一行的时间差,以便更准确地计算我的电子邮件阅读总时间。输出将是:

        Starttime          Endtime                                         

        12/18/2019 4:06:59PM    12/18/2019 4:07:05 PM      A        6 secs
        12/18/2019 4:07:26PM    12/18/2019 4:07:28 PM      A        1 secs
        12/17/2019 6:48:06PM    12/17/2019 6:48:07PM       A        1 sec
        12/17/2019 6:25:16PM    12/17/2019 6:25:22PM       A        6 secs

data.frame 拆分为 ID,然后确定每个

的时间
#sample data saved to df1
list1 <- split(df1, df1$ID)
lapply(list1, function(x) difftime(head(x$Starttime, n = 1), tail(x$Endtime, n = 1), units = "sec"))

$A
Time difference of 78097 secs

如果您希望每一行都不同,那么您不想对每个 ID 进行汇总,而是在不分组的情况下进行变异并删除 firstlast 函数调用。

因此,您的代码应如下所示:

data <- rawdata %>% 
  mutate(diff = difftime(as.POSIXct(Endtime, format = "%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs"))

但是,当您使用日期时,您可能想要使用 lubridate 包,它比基础 R:

更灵活
library(lubridate)
data <- rawdata %>% 
  mutate_at(vars(Endtime, Starttime), as.POSIXct, format = "%m/%d/%Y %I:%M:%S %p") %>%
  mutate(diff = interval(Endtime, Starttime)/seconds(1))

然后,如果你想要总数,你可以按ID分组并汇总总和:

data %>% 
  group_by(ID) %>% 
  summarize(total=sum(diff))

对于您的下一个问题,请尝试对您的数据使用 dput 函数来共享一个可重现的示例,正​​如我在评论中所述。如果 he/she 可以复制粘贴您的代码并 运行 它,这对帮助者来说会容易得多。