You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:35:35