【问题标题】:Summing up periods总结时期
【发布时间】:2019-03-20 09:48:52
【问题描述】:

我的表中有一个润滑周期列,如下所示。

workerID   worked_hours
02         08H30M00S
02         08H00M00S    
03         08H00M00S
03         05H40M00S

我想要实现的就是将workerID 工作的小时数相加。而且我还希望它采用 HH:MM:SS 格式,即使小时数超过 24,我也不希望它有一天,而是将小时数累积到 24 以上。 我尝试过使用

df %>%
 group_by(workerID) %>% 
 summarise(sum(worked_hours))

但这会返回一个0

【问题讨论】:

  • 尝试以秒为单位转换您的工作时间并进行总结

标签: r date lubridate


【解决方案1】:

您可以使用 lubridate 包,它可以让您更轻松地处理时间。在您的情况下,我们需要先转换为 hms(小时分钟秒)类,按工人 ID 分组并采用 sum。但是,为了得到HH:MM:SS的格式,我们需要转换为句点,即

library(tidyverse)
library(lubridate)

df %>% 
 mutate(new = as.duration(hms(worked_hours))) %>% 
 group_by(workerID) %>% 
 summarise(sum_times = sum(new)) %>% 
 mutate(sum_times = seconds_to_period(sum_times))

给出,

# A tibble: 2 x 2
   workerID sum_times   
     <int> <S4: Period>
1        2 16H 30M 0S  
2        3 13H 40M 0S

【讨论】:

  • 它工作得很好,但我有一天的总和,就像这样一个 1d 15H 25M 0S 我需要将它保持为 HH:MM:SS 即 39H25M00S
【解决方案2】:

还有一个基本的 R 解决方案。我添加了超过分钟和小时的行。

  workerID worked_hours
1        2    08H30M00S
2        2    08H00M00S
3        3    08H00M00S
4        3    05H40M00S
5        2    09H45M00S

我们可以在字符处拆分worked_hours,然后按工人的ID 聚合它。之后,我们需要从分钟中减去整小时。最后我们用:折叠时间。

p <- cbind(p[1], do.call(rbind, lapply(strsplit(p$worked_hours, "\\D"), as.numeric)))
p <- aggregate(. ~ workerID, p, sum)
p$`1` <- p$`1` + floor(p$`2` / 60)
p$`2` <- p$`2` %% 60
p[-1] <- lapply(p[-1], function(x) sprintf("%02d", x))  # to always have two digits
cbind(p[1], worked_hours=apply(p[-1], 1, function(x) paste(x, collapse=":")))
#   workerID worked_hours
# 1        2     26:15:00
# 2        3     13:40:00

数据

p <- structure(list(workerID = c("2", "2", "3", "3", "2"), worked_hours = c("08H30M00S", 
    "08H00M00S", "08H00M00S", "05H40M00S", "09H45M00S")), row.names = c(NA, 
    -5L), class = "data.frame")

【讨论】:

  • 这不是 OP 所要求的。他们需要总和
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多