【发布时间】:2020-03-06 12:42:31
【问题描述】:
我有一个包含每个工作日工作时间的数据框。我每天都有开始和结束时间。当员工在同一天工作两次时,就会出现问题。例如,他从周五晚上 10 点开始工作,周六早上 8 点下班,但周六晚上 10 点又开始工作。 我的数据集现在的结构是这样的:
dput(droplevels(head(data1, 10)))
structure(list(Mon.Start1 = structure(c(2L, 1L, 1L, 4L, 1L, 3L,
2L, 4L, 1L, 1L), .Label = c(" ", "14:30:00", "22:30:00", "7:00:00"
), class = "factor"), Mon.End1 = structure(c(4L, 1L, 1L, 2L,
1L, 6L, 5L, 3L, 1L, 1L), .Label = c(" ", "16:00:00", "17:30:00",
"23:15:00", "23:30:00", "24:00:00"), class = "factor"), Mon.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = " ", class = "factor"),
Mon.End2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = " ", class = "factor"), Tue.Start1 = structure(c(4L,
1L, 3L, 5L, 1L, 2L, 1L, 5L, 5L, 1L), .Label = c(" ", "0:00:00",
"14:00:00", "14:30:00", "7:00:00"), class = "factor"), Tue.End1 = structure(c(3L,
1L, 4L, 2L, 1L, 5L, 1L, 2L, 2L, 1L), .Label = c(" ", "16:30:00",
"23:15:00", "24:00:00", "8:00:00"), class = "factor"), Tue.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c(" ", "22:30:00"
), class = "factor"), Tue.End2 = structure(c(1L, 1L, 1L,
1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c(" ", "24:00:00"), class = "factor"),
Wed.Start1 = structure(c(1L, 3L, 1L, 3L, 1L, 2L, 1L, 3L,
3L, 1L), .Label = c(" ", "0:00:00", "7:00:00"), class = "factor"),
Wed.End1 = structure(c(1L, 3L, 1L, 3L, 1L, 5L, 1L, 4L, 2L,
1L), .Label = c(" ", "16:30:00", "17:00:00", "17:30:00",
"8:00:00"), class = "factor"), Wed.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c(" ", "22:30:00"
), class = "factor"), Wed.End2 = structure(c(1L, 1L, 1L,
1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c(" ", "24:00:00"), class = "factor"),
Thu.Start1 = structure(c(1L, 1L, 1L, 4L, 1L, 2L, 3L, 4L,
4L, 1L), .Label = c(" ", "0:00:00", "14:30:00", "7:00:00"
), class = "factor"), Thu.End1 = structure(c(1L, 1L, 1L,
2L, 1L, 4L, 3L, 2L, 2L, 1L), .Label = c(" ", "16:30:00",
"24:00:00", "8:00:00"), class = "factor"), Thu.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = " ", class = "factor"),
Thu.End2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = " ", class = "factor"), Fri.Start1 = structure(c(2L,
1L, 1L, 4L, 3L, 1L, 1L, 4L, 4L, 1L), .Label = c(" ", "6:30:00",
"6:45:00", "7:00:00"), class = "factor"), Fri.End1 = structure(c(5L,
1L, 1L, 3L, 2L, 1L, 1L, 4L, 2L, 1L), .Label = c(" ", "16:30:00",
"16:45:00", "17:30:00", "18:30:00"), class = "factor"), Fri.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = " ", class = "factor"),
Fri.End2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = " ", class = "factor"), Sa.Start1 = structure(c(4L,
5L, 1L, 1L, 3L, 1L, 1L, 5L, 1L, 2L), .Label = c(" ", "14:00:00",
"14:45:00", "6:30:00", "7:00:00"), class = "factor"), Sa.End1 = structure(c(4L,
3L, 1L, 1L, 5L, 1L, 1L, 2L, 1L, 6L), .Label = c(" ", "16:30:00",
"17:00:00", "18:30:00", "23:15:00", "24:00:00"), class = "factor"),
Sa.Start2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = " ", class = "factor"), Sa.End2 = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = " ", class = "factor"),
Sun.Start1 = structure(c(4L, 1L, 1L, 1L, 3L, 1L, 1L, 1L,
1L, 2L), .Label = c(" ", "0:00:00", "14:45:00", "6:30:00"
), class = "factor"), Sun.End1 = structure(c(3L, 1L, 1L,
1L, 4L, 1L, 1L, 1L, 1L, 2L), .Label = c(" ", "0:30:00", "16:45:00",
"23:15:00"), class = "factor"), Sun.Start2 = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c(" ", "14:00:00"
), class = "factor"), Sun.End2 = structure(c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c(" ", "24:00:00"), class = "factor")), row.names = c("21",
"22", "23", "25", "26", "27", "28", "31", "34", "35"), class = "data.frame")
我尝试使用包 lubridate 设置开始和结束时间。我还添加了所有日期的日期(as.POSICxt)当员工一天只工作一次时,它可以工作,但当他工作两次时就不行。因为有时我的结束时间实际上是结束时间(因为星期一 24:00 是结束时间)但有时它会持续一夜(如星期五和星期六),所以 24:00 不是结束时间。是否有设置每次开始时间为 00 时开始时间应为前一天的 start2 的功能?或者我该如何解决这个问题?目标是创建休息时间并标记每个班次,按开始时间如夜间、晚班等和 difftime。同样对于那些工作两次的人,如果我削减并标记开始时间来定义轮班,因为员工有两个开始时间,所以我每周多轮班结束,这实际上是不正确的。
所需的输出是在一列中显示星期几、开始时间、结束时间、轮班长度、轮班类型(关闭、早上、深夜、晚上),然后在每天都有这些之后能够在每周级别和每月级别进行一些计算。
如果有人能给我一些建议,我将非常感激。谢谢
【问题讨论】:
-
欢迎来到 Stack Overflow。帮助我们帮助您,以人们可以使用的方式提供数据。从这里开始stackoverflow.com/questions/5963269/… 显示一些代码而不是描述您正在尝试的内容。显示预期结果。
-
@Sunshine_student 您可以尝试再次粘贴数据吗?它看起来像被切断并且看起来不完整。也许你可以为前 10 行数据做
dput(head(data1, 10))? -
@Ben,像这样吗?这里它们仍然是因子,我为每一天插入一个日期并将它们分成两个,一个作为日期,另一个作为时间。谢谢你
标签: r datetime intervals lubridate difftime