在R中建模制造流程:剔除非工作日时间的技术咨询
制造车间工序时长分析问题
背景需求
我经营一家小型制造车间,需要分析各工序的平均加工时长及工序间的平均转运时长。生产并非每日进行(周末、节假日、设备维护等),核心需求是计算实际工作时长而非挂钟时长。
这个问题和常见的“判断日期是否为周末”问题不同:
- 前者仅针对周末,我需要剔除所有无工作的日期;
- 前者仅识别周末日期,我需要从数据中扣除非工作时间对应的分钟数。
数据结构
我拥有的DataFrame包含以下字段:
| 列名 | 内容 | 数据类型 |
|---|---|---|
| item | 制造的产品 | char |
| lotname | 批次名称 | char |
| tool | 工序使用的设备 | char |
| startTime | 工序开始时间 | datetime |
| endTime | 工序完成时间 | datetime |
现有代码
计算各工序平均加工时长
library(tidyverse) library(data.table) processTimes <- processTimes %>% filter(item == "item1") %>% group_by(lotname) %>% arrange(startTime) %>% mutate(toTool = lead(tool), # 下一道工序的设备 processingTime = as.numeric(difftime(endTime, startTime, units = "mins")), nextStartTime = lead(startTime), transitTime = as.numeric(difftime(nextStartTime, endTime, units = "mins")), ) %>% filter(!is.na(toTool)) # 最后一道工序没有下一个设备,故剔除 processing_summary <- processTimes %>% group_by(lotname, tool) %>% summarise( AvgProcessingTime = mean(processingTime, na.rm = TRUE), SEM_proc = sd(processingTime, na.rm = TRUE) / sqrt(n()), .groups = 'drop' )
计算工序间平均转运时长
transit_summary <- processTimes %>% group_by(lotname, tool) %>% summarise( avgTransitTime = mean(transitTime, na.rm = TRUE), SEM_transit = sd(transitTime, na.rm = TRUE) / sqrt(n()), .groups = 'drop' # 汇总后取消分组结构 )
识别有工作的日期
df <- processTimes %>% mutate(date = as.Date(startTime)) %>% add_count(date, name = "steps_count") all_dates <- data.frame(date = seq(min(df$date), max(df$date), by = "day")) # 将日期序列与工序计数数据合并 df_all_dates <- all_dates %>% left_join(df %>% select(date, steps_count) %>% distinct(), by = "date") %>% mutate(steps_count = ifelse(is.na(steps_count), 0, steps_count)) # 过滤出有工作的日期 df_filtered <- df_all_dates %>% filter(steps_count > 0)
技术问题
如何剔除非工作日的时间?
我已经得到分钟单位的加工和转运时长,但需要扣除对应非工作日的时长。复杂点在于:部分日期看似未处理该产品,但可能是工序跨天或产品在后续设备等待,因此不能仅看该产品的日期,需参考所有数据。如何确保转运时长不会连接某批次的最后一道工序与下一批次的第一道工序?
使用group_by(lotname)是否能解决此问题?
示例数据
| item | lotname | tool | startTime | endTime |
|---|---|---|---|---|
| Item1 | Lot1 | Tool 2 | 2025-01-03 18:31:59 | 2025-01-03 19:07:16 |
| Item1 | Lot1 | Tool 2 | 2025-01-05 06:04:05 | 2025-01-05 06:26:17 |
| Item1 | Lot1 | Tool 5 | 2025-01-10 03:37:30 | 2025-01-10 04:11:28 |
| Item1 | Lot1 | Tool 2 | 2025-01-11 10:28:29 | 2025-01-11 11:09:26 |
| Item1 | Lot1 | Tool 3 | 2025-01-14 08:26:25 | 2025-01-14 08:26:38 |
| Item1 | Lot1 | Tool 3 | 2025-01-15 06:06:40 | 2025-01-15 06:41:22 |
| Item1 | Lot1 | Tool 5 | 2025-01-18 13:24:15 | 2025-01-18 13:56:14 |
| Item1 | Lot1 | Tool 5 | 2025-01-19 09:52:46 | 2025-01-19 10:01:22 |
| Item1 | Lot1 | Tool 2 | 2025-01-20 20:07:42 | 2025-01-20 21:03:32 |
| Item1 | Lot1 | Tool 3 | 2025-01-22 16:33:51 | 2025-01-22 16:46:26 |
| Item1 | Lot2 | Tool 1 | 2025-01-03 22:20:49 | 2025-01-03 22:32:00 |
| Item1 | Lot2 | Tool 4 | 2025-01-05 12:32:38 | 2025-01-05 13:15:43 |
| Item1 | Lot2 | Tool 3 | 2025-01-08 20:14:48 | 2025-01-08 20:50:57 |
| Item1 | Lot2 | Tool 3 | 2025-01-09 09:37:53 | 2025-01-09 10:33:51 |
| Item1 | Lot2 | Tool 4 | 2025-01-14 11:11:07 | 2025-01-14 11:29:40 |
| Item1 | Lot2 | Tool 4 | 2025-01-19 06:56:30 | 2025-01-19 07:47:01 |
| Item1 | Lot2 | Tool 2 | 2025-01-22 14:12:21 | 2025-01-22 15:01:57 |
| Item1 | Lot2 | Tool 3 | 2025-01-25 08:24:16 | 2025-01-25 08:48:24 |
| Item1 | Lot2 | Tool 1 | 2025-01-25 08:26:47 | 2025-01-25 09:05:46 |
| Item1 | Lot2 | Tool 2 | 2025-01-25 09:17:21 | 2025-01-25 09:34:07 |
内容的提问来源于stack exchange,提问作者eBerm
相关产品推荐
相关产品推荐

