我有一个工作的开始和停止时间表,我想绘制出来.输入表看起来像这样:

job_started_at job_finished_at position
2024-04-29 18:35:09 2024-04-29 19:36:25 1
2024-04-29 18:33:19 2024-04-29 20:34:40 2
2024-04-29 19:37:17 2024-04-29 19:44:51 1
2024-04-29 21:12:35 2024-04-29 21:31:31 2
2024-04-29 20:31:52 2024-04-29 20:53:23 1

每天有多个条目.有2台机器处理作业(job)(由位置1和2指示),因此给定位置的时间间隔不能重叠. 我想在图表中显示一周中每天(星期一、星期二、星期三、星期四、星期五、星期六、星期日)每小时每台机器的工作负载.我正在考虑7个不同的图(每天1个),其中每小时得到一个矩形图.因此,如果一项工作于12:30开始并于13:15结束,则应在12小时内计入50%,在13小时内计入25%. 由于时间间隔可能与小时标记重叠,所以我不知道如何处理这个问题.

我正在考虑以下工作流程:

  • 添加指示作业(job)工作日的列(用于稍后分组)
  • 按小时分割所有作业(job)
  • 计算每个作业(job)的使用率
  • 按工作日和时间进行总结,并取所有工作负载的平均值

这还有一个问题,即机器可能根本不工作数小时,但对于上面的平均值计算,它仍然应该算作0%.

你有更好的 idea 或者可以帮助我实现我的 idea 吗?

非常感谢!

推荐答案

这是一种使用tidyverse(包括lubridate)的方法.输出是一个绘图框,您可以将其用作图表的基础.

#set initial data as per question
df <- structure(list(job_started_at = c("2024-04-29 18:35:09", "2024-04-29 18:33:19", 
                                        "2024-04-29 19:37:17", "2024-04-29 21:12:35", 
                                        "2024-04-29 20:31:52"
), job_finished_at = c("2024-04-29 19:36:25", "2024-04-29 20:34:40", 
                       "2024-04-29 19:44:51", "2024-04-29 21:31:31", 
                       "2024-04-29 20:53:23"
), position = c(1L, 2L, 1L, 2L, 1L)), class = "data.frame", row.names = c(NA, -5L))

df <- df %>% 
  mutate(across(starts_with("job"), ymd_hms),                  #convert to datetimes
         job_int = interval(job_started_at, job_finished_at))  #calculate intervals

#create a df of the hours to be analysed
hours_df <- tibble(hour = seq(from = ymd_hms("2024-04-29 17:00:00"),
                              to = ymd_hms("2024-04-29 22:00:00"),
                              by = "hour")) %>% 
  mutate(hour_int = interval(hour, hour + hours(1)))           #intervals
         
#for each item, calculate a vector of overlaps, unnest, group and summarise
overlaps_df <- df %>% 
  mutate(overlap = map(job_int, ~seconds(intersect(hours_df$hour_int, .))/3600),
         hour_start = list(hours_df$hour)) %>% 
  unnest_longer(c(overlap, hour_start)) %>% 
  group_by(position, hour_start) %>% 
  summarise(utilisation = sum(overlap, na.rm = TRUE))  

overlaps_df

# A tibble: 12 × 3
# Groups:   position [2]
   position hour_start          utilisation
      <int> <dttm>                    <dbl>
 1        1 2024-04-29 17:00:00       0    
 2        1 2024-04-29 18:00:00       0.414
 3        1 2024-04-29 19:00:00       0.733
 4        1 2024-04-29 20:00:00       0.359
 5        1 2024-04-29 21:00:00       0    
 6        1 2024-04-29 22:00:00       0    
 7        2 2024-04-29 17:00:00       0    
 8        2 2024-04-29 18:00:00       0.445
 9        2 2024-04-29 19:00:00       1    
10        2 2024-04-29 20:00:00       0.578
11        2 2024-04-29 21:00:00       0.316
12        2 2024-04-29 22:00:00       0    

R相关问答推荐

R -列表元素中所有命名项的总和

如何将多个数据帧附加到R中的多个相应的CSV文件中?

更改网格的crs以匹配简单要素点对象的crs

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

如果索引重复,聚合xts核心数据

在R中列表的结尾添加数字载体

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

R根据条件进行累积更改

将小数分隔符放在R中的前两位数字之后

2个Rscript.exe可执行文件有什么区别?

R中边际效应包中Logistic回归的交互作用风险比

哪一行和行和 Select 特定行,但是考虑到Nas

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

带RStatix的Wilcoxon环内检验

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

在不重复主题的情况下重新排列组