我有一个包含"登录的数据集"并且"退出"用户的时间。我想查看全时间范围并说出有多少时间进入第1班(5:30-1:30),第2班(1:30-9:30)和第3班(9:30-5) :30)。可以这样做吗?
在此数据集中,可能有一个人在重叠时间内登录到多个工作站。我不想将这些时间加在一起,所以我目前只是进行最小登录和最大登记时间并做了一个约会。问题是,他们的转变只能通过签到时间来考虑。所以,如果一个人在1:28的轮班前2分钟进来,那么当他们应该轮班2时,他们将他们的时间放在第一班......有关如何处理这个的任何想法?
答案 0 :(得分:0)
这是让你前进的基本答案。你希望时间分为三班。所以工作时间必须分成三个桶。铲斗边界由换挡的开始和结束时间定义。为了这个例子,我今天已经硬编码了。你显然需要调整它。
from datetime import datetime, timedelta
shift_start=(datetime(2018,3,5,5,30),
datetime(2018,3,5,13,30),
datetime(2018,3,5,21,30))
shift_end= (shift_start[1],
shift_start[2],
shift_start[0] + timedelta(days=1))
接下来,您有登录时间和退出时间。我让你的假设用户在三个班次工作,这在我居住的地方是非法的,但它允许更快的演示。
start_time = datetime(2018,3,5,5,45)
end_time = datetime(2018,3,5,21,45)
现在您需要一个功能,告诉您,对于任何给定的登录和退出时间,每个班次需要多少时间:
def time_in_shift(start, end, shift_start, shift_end):
if start < shift_start:
start = shift_start
if end > shift_end:
end = shift_end
return end-start
使用此选项将时间分成三个桶:
for shift in range(3):
print ("Time in shift", shift, time_in_shift(start_time, end_time, shift_start[shift], shift_end[shift]))
Time in shift 0 7:45:00
Time in shift 1 8:00:00
Time in shift 2 0:15:00
这需要一些抛光来覆盖角落的情况。例如,如果有人在05h15登录,那么他们已经登录了上一个日的最后一班15分钟。根据您的应用程序的意图,那个时间可能同样被分配到当前日的最后一班;或不。所以,由您来解决。如果您的目的是计算工资,那么您还需要考虑周末,因为通常人们会在工作周末获得更多报酬。而且你还需要知道周末什么时候开始。是星期五21点30分还是星期六00点00分?如果是后者那么你实际上有4个班次而不是3:21h30到23h59和00h00到05h30。