我知道有很多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
在此先感谢您的帮助,如果无法在其他地方找到答案,我深感抱歉。
答案 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
使用dplyr
和lubridate
,我们首先将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