Python:进入“移位”桶的时间段

问题描述 投票:-1回答:1

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

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

python date-range
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.