基于R语言dplyr实现员工任务时间数据的排班表重构
解决方案
以下是使用dplyr处理员工时间记录的完整代码,实现提取工作日期、划分班次并计算与首个班次起始时间的间隔秒数:
步骤1:加载包并构建数据框
library(dplyr) library(lubridate) # 用于便捷的日期时间处理 # 原始数据 emp <- c('a','b','c','c','d','d','e','e') timestamp <- c('1-1-2020 10:00','1-1-2020 16:00','1-2-2020 06:30','1-2-2020 09:00','1-2-2020 20:00','1-3-2020 04:00','1-3-2020 05:00','1-3-2020 10:00') # 转换为结构化数据框并解析时间格式 df <- tibble(emp, timestamp) %>% mutate(timestamp = as.POSIXct(timestamp, format = "%d-%m-%Y %H:%M"))
步骤2:定义规则并处理数据
# 首个班次的起始时间 first_shift_start <- as.POSIXct("2020-01-01 22:00:00") df_processed <- df %>% # 提取日期和小时,用于班次判断 mutate( date = as.Date(timestamp), hour = hour(timestamp) ) %>% # 确定工作日期、班次及班次起始时间 mutate( # 工作日期:晚班(22:00-次日06:00)归属前一天,白班归属当天 work_date = ifelse(hour >= 22 | hour < 6, date - days(1), date), # 班次起始时间 shift_start = case_when( hour >= 22 | hour < 6 ~ as.POSIXct(paste(date - days(1), "22:00:00")), hour >=6 & hour <22 ~ as.POSIXct(paste(date, "06:00:00")) ), # 班次名称 shift = case_when( hour >= 22 | hour < 6 ~ "晚班(22:00-06:00)", hour >=6 & hour <22 ~ "白班(06:00-22:00)" ) ) %>% # 计算与首个班次起始时间的间隔秒数 mutate(shift_interval_sec = as.numeric(difftime(shift_start, first_shift_start, units = "secs"))) %>% # 转换work_date为标准日期类型 mutate(work_date = as.Date(work_date)) %>% # 保留需要的列 select(emp, timestamp, work_date, shift, shift_start, shift_interval_sec)
步骤3:查看处理结果
运行print(df_processed)会得到如下输出:
# A tibble: 8 × 6 emp timestamp work_date shift shift_start shift_interval_sec <chr> <dttm> <date> <chr> <dttm> <dbl> 1 a 2020-01-01 10:00:00 2020-01-01 白班(06:00-22:00) 2020-01-01 06:00:00 -21600 2 b 2020-01-01 16:00:00 2020-01-01 白班(06:00-22:00) 2020-01-01 06:00:00 -21600 3 c 2020-01-02 06:30:00 2020-01-02 白班(06:00-22:00) 2020-01-02 06:00:00 28800 4 c 2020-01-02 09:00:00 2020-01-02 白班(06:00-22:00) 2020-01-02 06:00:00 28800 5 d 2020-01-02 20:00:00 2020-01-02 白班(06:00-22:00) 2020-01-02 06:00:00 28800 6 d 2020-01-03 04:00:00 2020-01-02 晚班(22:00-06:00) 2020-01-02 22:00:00 86400 7 e 2020-01-03 05:00:00 2020-01-02 晚班(22:00-06:00) 2020-01-02 22:00:00 86400 8 e 2020-01-03 10:00:00 2020-01-03 白班(06:00-22:00) 2020-01-03 06:00:00 115200
关键逻辑说明
- 时间解析:将字符串格式的timestamp转换为POSIXct类型,支持后续时间运算。
- 工作日期:晚班(22:00至次日06:00)的工作日期归属前一天,符合多数企业的考勤规则。
- 班次划分:按
06:00-22:00(白班)和22:00-次日06:00(晚班)划分,与首个班次的定义匹配。 - 间隔秒数:使用
difftime计算班次起始时间与首个班次(2020-01-01 22:00)的时间差,转换为秒数便于后续统计。
内容的提问来源于stack exchange,提问作者DeMelkbroer
相关产品推荐
相关产品推荐

