不规则时间 - 根据开始和停止时间计算唯一分钟

时间:2017-11-02 14:12:53

标签: r

我刚刚开始深入学习R而且我也试图看看它是否可以帮助我解决工作问题我正在计算员工利用率。

我正在尝试计算每个员工每天的分钟工作时间,然后我将其除以他们当天的总分钟数。总时钟分钟很容易获得,但劳动力是棘手的,因为我给出的唯一数据是员工及其开始和停止劳动时间。我正在努力学习如何确保我不会加倍工作时间。

我在下面拼凑了一些虚拟数据。什么是最好的方法来总结他们当天的某事的总分钟数?它变得棘手,因为它们同时为多个事物计时,并且它们不一定同时停止。因此,您需要删除大量重叠。

我在HANA / SQL中与此搏斗。我最终做了一个丑陋的交易,我创建了一个表,每天的每一分钟都有一个记录,然后进行交叉连接并从那里汇总,但我遇到了一些问题,那里有第三班人,他们跨越了几天。

想知道我能用R做些什么可能有帮助。

Employee    Start                   Stop
Eddie       8/21/2017 6:57:00 AM    8/21/2017 10:45:00 AM
Eddie       8/21/2017 6:57:00 AM    8/21/2017 10:57:00 AM
Eddie       8/21/2017 6:57:00 AM    8/21/2017 11:27:00 AM
Eddie       8/21/2017 11:58:00 AM   8/21/2017 12:57:00 PM
Joe         8/21/2017 5:38:00 AM    8/21/2017 7:00:00 AM
Joe         8/21/2017 5:38:00 AM    8/21/2017 7:00:00 AM
Joe         8/21/2017 7:46:00 AM    8/21/2017 9:11:00 AM
Joe         8/21/2017 7:46:00 AM    8/21/2017 9:12:00 AM
Joe         8/21/2017 9:52:00 AM    8/21/2017 12:35:00 PM
Joe         8/21/2017 9:52:00 AM    8/21/2017 12:40:00 PM
Joe         8/21/2017 11:46:00 AM   8/21/2017 1:46:00 PM

为了澄清,我所遇到的问题不是总结当天的工作并将其分解给员工,问题是他们有多行重叠时间的情况。我想确保一天中的每一分钟只计算一次。

在上面的示例中,例如Eddie,他有4条记录,但其中有三条重叠。我需要的是一种逻辑上的说法,Eddie从早上6:57到凌晨11:27钟表。计算这两次之间的分钟数,然后拿起最后一个没有重叠的时钟(11:58 AM到12:57)。希望这是有道理的。这是一个奇怪的时间问题,我以前从来没有打过。

1 个答案:

答案 0 :(得分:0)

使用基数R:

dt[['duration']] <- as.numeric(difftime(dt$Stop, dt$Start), units = 'mins')
splitDt <- split(dt$duration, dt$Employee)
sapply(splitDt, sum)

使用dplyr包:

库(dplyr)

dt %>%
  group_by(Employee) %>%
  summarize(totalDuration = sum(duration))

您需要使用difftime计算持续时间并转换为正确的单位。然后,您可以按员工对数据进行分组或拆分。

如果不超过几分钟,您可以执行以下操作:

splitDt <- split(dt, dt$Employee)
seqMin <- mapply(seq, dt$Start, dt$Stop, by = 'min', SIMPLIFY = FALSE)
sapply(unique(dt$Employee), function(employee) {
  i <- grep(employee, dt$Employee)
  length(unique(unlist(seqMin[i])))
})

创建分钟序列,然后将所有分钟组合在一起。计算不同的时间间隔将提供所需的输出。