计算分组的行集中经过的时间

时间:2019-01-04 16:38:33

标签: r datetime

我知道有很多stackoverflow页面询问有关计算行之间的日期时间差的问题,但是我还没有找到一个页面可以回答我的特定问题。大多数人都对后续行之间的数据感兴趣,但是我需要为一系列个人计算每个个人已经花费了多少时间。例如

id      time (of the day)
1       12:00:40
1       12:06:35
1       12:12:00
2       14:59:22
2       15:10:40

我想计算出如下形式的东西:

   id      total time (seconds)
    1       760
    2       678

在此先感谢您的帮助,如果无法在其他地方找到答案,我深感抱歉。

2 个答案:

答案 0 :(得分:2)

完整的基础R方法

aggregate(time~id, transform(df, time = as.POSIXct(time, format = "%H:%M:%S")), 
                   function(x) sum(as.numeric(diff(x), "secs")))

#  id time
#1  1  680
#2  2  678

使用dplyrlubridate,我们首先将time转换为Period类,并将其转换为秒,并求出其差值sum

library(dplyr)
library(lubridate)

df %>%
  group_by(id) %>%
  summarise(total_time = sum(diff(seconds(hms(time)))))


#    id   total_time
#   <int>      <dbl>
#1     1        680
#2     2        678

答案 1 :(得分:0)

data.table方法

首先将时间字符串设置为POSIXct格式,以便可以使用诸如difftime之类的函数。当id的时间跨度超过1天(例如从22h到02h)时,这会派上用场 第二步是计算最小时间值和最大时间值(按id组)之间的时差(以秒为单位)

library( data.table )

dt <- fread("id      time
1       12:00:40
1       12:06:35
1       12:12:00
2       14:59:22
2       15:10:40", header = TRUE)

#set time to POSIXct
dt[, time := as.POSIXct( paste0( "2019-01-01 ", time ), format = "%Y-%m-%d %H:%M:%S" ) ]
dt[, .( total_time = difftime( max( time ), min( time ), units = "secs" )), by = .( id ) ]

#    id total_time
# 1:  1   680 secs
# 2:  2   678 secs