【发布时间】:2019-09-03 14:28:47
【问题描述】:
我有以下格式的数据供人们打卡工作时间:
(dat<-data.frame(Date = c("1/1/19", "1/2/19", "1/4/19", "1/2/19"),
Person = c("John Doe", "Brian Smith", "Jane Doe", "Alexandra Wakes"),
Time_In = c("1:15pm", "1:45am", "11:00pm", "1:00am"),
Time_Out = c("2:30pm","3:33pm","3:00am","1:00am")))
Date Person Time_In Time_Out
1 1/1/19 John Doe 1:15pm 2:30pm
2 1/2/19 Brian Smith 1:45am 3:33pm
3 1/4/19 Jane Doe 3:00pm 3:00am
4 1/2/19 Alexandra Wakes 1:00am 1:00am
我希望用 R 或 Python 编写一个函数,它将每个人工作的总小时数提取到 24 个不同的桶中,每个桶作为自己的列。它看起来像这样:
所以在第一种情况下,这个人从下午 1:15 到下午 2:30 工作,所以他们从下午 1 点到下午 2 点(13-14 点)工作了 0.75 小时,从下午 2 点到下午 3 点(14-15 点)工作了 0.5 小时)。
我认为可能有用的一些事情是......
- 一系列嵌套循环
- 一长串 if/then 语句
- Tidyverse 或 Pandas 中的一些我还没有想到的功能。
上面的#1 和#2 (?) 的尝试完全失败。不确定工作流程是什么,但非常感谢任何建议。
请注意,结果表中的列不必是数字(可以是第 1 小时、第 2 小时等,或者只是一般的任何因素 - 只要它代表 24 小时的时间段)。
我过去的尝试包括嵌套的 for 循环,如下所示:
for (i in 1:nrow(data)){
if((int_overlaps(createinterval(data$PunchDate[i],0,1), workinterval[i]))){ `0-1`[i]=1} else{ `0-1`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],1,2), workinterval[i]))){ `1-2`[i]=1} else{ `1-2`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],2,3), workinterval[i]))){ `2-3`[i]=1} else{ `2-3`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],3,4), workinterval[i]))){ `3-4`[i]=1} else{ `3-4`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],4,5), workinterval[i]))){ `4-5`[i]=1} else{ `4-5`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],5,6), workinterval[i]))){ `5-6`[i]=1} else{ `5-6`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],6,7), workinterval[i]))){ `6-7`[i]=1} else{ `6-7`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],7,8), workinterval[i]))){ `7-8`[i]=1} else{ `7-8`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],8,9), workinterval[i]))){ `8-9`[i]=1} else{ `8-9`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],9,10), workinterval[i]))){ `9-10`[i]=1} else{ `9-10`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],10,11), workinterval[i]))){ `10-11`[i]=1} else{ `10-11`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],11,12), workinterval[i]))){ `11-12`[i]=1} else{ `11-12`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],12,13), workinterval[i]))){ `12-13`[i]=1} else{ `12-13`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],13,14), workinterval[i]))){ `13-14`[i]=1} else{ `13-14`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],14,15), workinterval[i]))){ `14-15`[i]=1} else{ `14-15`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],15,16), workinterval[i]))){ `15-16`[i]=1} else{ `15-16`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],16,17), workinterval[i]))){ `16-17`[i]=1} else{ `16-17`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],17,18), workinterval[i]))){ `17-18`[i]=1} else{ `17-18`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],18,19), workinterval[i]))){ `18-19`[i]=1} else{ `18-19`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],19,20), workinterval[i]))){ `19-20`[i]=1} else{ `19-20`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],20,21), workinterval[i]))){ `20-21`[i]=1} else{ `20-21`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],21,22), workinterval[i]))){ `21-22`[i]=1} else{ `21-22`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],22,23), workinterval[i]))){ `22-23`[i]=1} else{ `22-23`[i]=0}
if((int_overlaps(createinterval(data$PunchDate[i],23,24), workinterval[i]))){ `23-24`[i]=1} else{ `23-24`[i]=0}
}
cbind(data, `0-1`, `1-2`, `2-3`, `3-4`, `4-5`, `5-6`,
`6-7`, `7-8`, `8-9`, `9-10`, `10-11`, `11-12`,
`12-13`, `13-14`, `14-15`, `15-16`, `16-17`, `17-18`, `18-19`,
`19-20`, `20-21`, `21-22`, `22-23`, `23-24`
)
【问题讨论】:
-
我现在没有时间为您制定完整的解决方案,但您可能会受益于查看:stackoverflow.com/questions/38339812/binning-time-data-in-r 和stackoverflow.com/questions/29833538/… 上的第二个答案
-
谢谢。这些链接(特别是第二个)很有帮助,但我仍然无法找到我想要的解决方案。
-
到目前为止,您尝试过哪些完全失败的尝试?了解您的一些想法仍然很有帮助,即使它没有成功
-
我尝试了一系列非常慢的 for 循环。