Python:时间段进入'转移'水桶

时间:2018-03-05 14:01:25

标签: python date-range

我有一个包含"登录的数据集"并且"退出"用户的时间。我想查看全时间范围并说出有多少时间进入第1班(5​​:30-1:30),第2班(1:30-9:30)和第3班(9:30-5) :30)。可以这样做吗?

在此数据集中,可能有一个人在重叠时间内登录到多个工作站。我不想将这些时间加在一起,所以我目前只是进行最小登录和最大登记时间并做了一个约会。问题是,他们的转变只能通过签到时间来考虑。所以,如果一个人在1:28的轮班前2分钟进来,那么当他们应该轮班2时,他们将他们的时间放在第一班......有关如何处理这个的任何想法?

1 个答案:

答案 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。