R 计算没有并发时间的时间总和

R 计算没有并发时间的时间总和,r,lubridate,R,Lubridate,我有一个人的时间数据框。我想计算净时间,但要减去并发性。例如,在下面的df中,bob在两个时间段内有12:00到14:00,因此结果将显示120分钟。乔的时间并没有重叠,所以结果是180分钟 data.frame ( person=c("bob", "joe", "rick","bob","joe"), start=c("12:00","13:00

我有一个人的时间数据框。我想计算净时间,但要减去并发性。例如,在下面的df中,bob在两个时间段内有12:00到14:00,因此结果将显示120分钟。乔的时间并没有重叠,所以结果是180分钟

  data.frame (
    person=c("bob", "joe", "rick","bob","joe"),
    start=c("12:00","13:00","13:30","12:30","16:00"),
    stop=c("13:00","15:00","14:00","14:00","17:00")
  )
我从哪里开始?似乎我会先用for循环计算每一行之间的时间差,然后用person的总和减去净差,但这似乎是一种笨拙的方法

编辑:抱歉,示例输出如下:

  data.frame (
    person=c("bob", "joe", "rick"),
    time=c("2:30","3:00","0:30"),
  )
编辑2: 更真实的数据,逗号分隔

"BGN","END","Date","Diff"
"2020-09-24 07:19:00","2020-09-24 11:06:00","2020-09-24",227
"2020-09-24 07:25:00","2020-09-24 11:00:00","2020-09-24",215
"2020-09-24 08:28:00","2020-09-24 09:30:00","2020-09-24",62
"2020-09-24 10:17:00","2020-09-24 11:31:00","2020-09-24",74
"2020-09-24 11:40:00","2020-09-24 14:10:00","2020-09-24",150
"2020-09-24 11:43:00","2020-09-24 13:25:00","2020-09-24",102
"2020-09-24 12:13:00","2020-09-24 15:15:00","2020-09-24",182
"2020-09-24 14:14:00","2020-09-24 16:28:00","2020-09-24",134
"2020-09-24 14:44:00","2020-09-24 15:14:00","2020-09-24",30
"2020-09-24 15:39:00","2020-09-24 16:23:00","2020-09-24",44
"2020-09-24 16:41:00","2020-09-24 19:00:00","2020-09-24",139
"2020-09-24 16:41:00","2020-09-24 19:41:00","2020-09-24",180
"2020-09-24 16:45:00","2020-09-24 19:00:00","2020-09-24",135
也许这有帮助

library(dplyr)
library(lubridate)
df1 %>%
   mutate(across(c(start, stop), ~ as.POSIXct(., format = '%H:%M'))) %>% 
   group_by(person) %>%
   summarise(time = seconds_to_period(sum(difftime(stop, start, 
    unit = 'sec'))), time = sprintf('%s:%s', hour(time), minute(time)))
-输出

# A tibble: 3 x 2
#  person time 
#  <chr>  <chr>
#1 bob    2:30 
#2 joe    3:0  
#3 rick   0:30 
#一个tible:3 x 2
#人时
#    
#1鲍勃2:30
#乔2:3:0
#3:0:30

您可以将当前
BGN
小于
lag(END)
的一组中的时间压缩在一起,并且在每个组中获得每个组中
max(END)
min(BGN)
之间的差异。最后计算每个人的联合收割机时间

library(dplyr)

df1 %>%
  mutate(across(c(BGN, END), lubridate::ymd_hms)) %>%
  group_by(person_name, grp = cumsum(BGN >= lag(END, default = first(END)))) %>%
  summarise(time = difftime(max(END), min(BGN), units = 'secs')) %>%
  summarise(time = sum(time))

您能显示预期的输出吗?这里显示的是所有个体时间的某些部分之间的并发。一个优先于另一个吗?您的第一步是确定如何将字符串
“13:30”
转换为类似数字的对象。Base R支持带有
as.POSIXct
的时间戳,但也表示日期。还有其他支持非日期时间的软件包(
lubridate
anytime
zoo
data.table
)。或者使用一个自定义函数将其转换为十进制数,可以基于秒、分钟或小时(我推荐秒)。一旦你解决了这个问题,然后试着找出如何进行差分。为了简单起见,我创建了上面的数据框。我确实和lubridate算出了日期时间。关于并发性,是的,一些时间块会有重叠,而其他时间块不会。我希望删除时间块中并发部分的时间总和。我将尝试创建一个更真实的数据框进行解释。edit2中的唯一id是什么?其中没有
人名
。出于某种原因,它将3:54作为我在编辑中粘贴的csv数据的H:M结果。是不是日期格式问题导致了这种情况?我确实在as.POSIXct格式参数中尝试了ymd_hms。@brett在显示的新数据中,您已经有了
diff
输出。是否要转换这些值?我希望该函数计算类似人员的净时间,但不包括净计算中的并发时间。例如,如果一个人从12点开始记录时间;00到12:30和12:15到13:00,我希望最终结果是1小时(12和13:00之间的差异),而不是1:15,这将是两个时间差异的简单相加。