计算一周中几天之间的时差(以分钟为单位)

时间:2018-02-22 17:59:00

标签: python datetime

假设我们有一个名为interval的空列表和一个名为shifts的列表列表,其中包含:day_of_week,shift_start和shift_end:

    interval = []
    shifts = [['Mon', '01:00', '22:00'], 
     ['Tue', '02:00', '23:00'],
     ['Wed', '01:15', '23:30'],
     ['Thu', '01:00', '21:00'],
     ['Fri', '02:30', '22:00'],
     ['Sat', '01:00', '21:00'],
     ['Sun', '03:00', '23:00']
    ]

interval列表将包含班次之间的时差(以分钟为单位)。例如,interval的第一个元素将是'Mon', '22:00''Tue', '02:00'之间的时差240,最后一个元素将是{{1}之间的时差}和'Sun', '23:00' 'Mon','01:00'

这是我的代码:

120

问题是,程序忽略day_of_week,因此假设interval = [] start_time = [] end_time = [] for each in shifts: start_time.append([each[0],each[1]]) end_time.append([each[0],each[2]]) start_val = ','.join([each[0], each[1]]) start_time.append(start_val) end_val = ','.join([each[0], each[2]]) end_time.append(end_val) for i in range(len(shifts)): t1 = datetime.datetime.strptime(end_time[i],'%a').strftime() if(i < len(shifts)-1): t2 = datetime.datetime.strptime(start_time[i+1], '%a,%H:%M') else: t2 = datetime.datetime.strptime(start_time[0], '%a,%H:%M') delta = int((t1-t2).total_seconds()/60) interval.append(delta) t1在同一天。所以在我的程序中,间隔的第一个元素是t2,这是1320小时。

需要帮助来解决问题。如果我的整个代码错误或不方便,请提供解决问题的最佳方法。

3 个答案:

答案 0 :(得分:1)

您可以将开始时间和结束时间转换为纪元(基本上是一个数字),然后简单地计算差异。

这种差异将以秒为单位(或毫秒,具体取决于实施情况),您可以根据需要进一步转换为秒/分钟/小时。

Epoch基本上用于存储日期,但由于它们对您不是很重要(如周一18日和周一25日相同),只需采用随机日期并将时间分配给开始和结束时间。由于它或多或少是标准的东西,因此会有很多图书馆帮助你。

所以

start_time.append([(somedate day)+ each[0],(somedate + day) + each[1]])
end_time.append([(somdate + day) +each[0],(somedate + day)each[2]])

...

t1 = int(datetime.datetime.strptime('Jan 1 1970' + end_time[i],yourFormat))
t2 = int(datetime.datetime.strptime('Jan 2 1970' + start_time[i+1], yourFormat))

这种差异会给你预期的结果。

答案 1 :(得分:1)

这可能有帮助

from datetime import datetime
formattime = datetime.strptime

interval = []
shifts = [['Mon', '01:00', '22:00'], 
 ['Tue', '02:00', '23:00'],
 ['Wed', '01:15', '23:30'],
 ['Thu', '01:00', '21:00'],
 ['Fri', '02:30', '22:00'],
 ['Sat', '01:00', '21:00'],
 ['Sun', '03:00', '23:00']
]

这附加在这里,我们可以称之为小型hacky预处理。

shifts.append(shifts[0])

方法get_delta返回两个日期时间参数的timedelta。

def get_delta(day1, day2):
    day, start, end, n_day, n_start, n_end = day1 + day2
    return formattime(n_day + n_start, '%a%H:%M') - formattime(day + end, '%a%H:%M')

枚举列表为您提供索引和作为i,day1解压缩的值。最终案例还有一个条件。第2天由下一个索引拍摄。

for i, day1 in enumerate(shifts):
    if i+1 == len(shifts):
        break
    day2 = shifts[i+1]
    delta = get_delta(day1, day2).seconds / 60
    interval.append(delta)
print(interval)

结果(以分钟为单位):

 [240, 135, 90, 330, 180, 360, 120]

答案 2 :(得分:1)

选择一些星期日至星期六的随机日期

import datetime
sun = datetime.datetime(2018,2,18)
mon = datetime.datetime(2018,2,19)
tue = datetime.datetime(2018,2,20)
wed = datetime.datetime(2018,2,21)
thu = datetime.datetime(2018,2,22)
fri = datetime.datetime(2018,2,23)
sat = datetime.datetime(2018,2,24)

day_of_week = {'sun':sun,'mon':mon,'tue':tue, 'wed':wed,
               'thu':thu,'fri':fri, 'sat':sat}

使用timedelta对象获取 next 星期一

next_week = datetime.timedelta(days=7)

shifts = [['Mon', '01:00', '22:00'], ['Tue', '02:00', '23:00'],
          ['Wed', '01:15', '23:30'], ['Thu', '01:00', '21:00'],
          ['Fri', '02:30', '22:00'], ['Sat', '01:00', '21:00'],
          ['Sun', '03:00', '23:00']]

遍历轮班并使开始和结束时间的datetime.datetime对象将先前创建的日期与轮班时间相结合

dt_shifts = []
for day, start, end in shifts:
    hh, mm = map(int, start.split(':'))
    start = datetime.datetime.combine(day_of_week[day.lower()], datetime.time(hh, mm))
    hh, mm = map(int, end.split(':'))
    end = datetime.datetime.combine(day_of_week[day.lower()], datetime.time(hh, mm))
    dt_shifts.append((day, start, end))

获取相邻班次的开始和结束时间,减去并打印

for (day0,start0,end0), (day1,start1,end1) in zip(dt_shifts, dt_shifts[1:]):
    dt = start1 - end0
    print(f'{day0} - {day1} | {dt.seconds / 60}')

在星期一添加一周,并将其用于最后一个时间间隔

day0,start0,end0 = day1,start1,end1
day1, start1, end1 = dt_shifts[0][0],dt_shifts[0][1] + next_week, dt_shifts[0][2] + next_week
print(f'{day0} - {day1} | {dt.seconds / 60}')
>>>   
Mon - Tue | 240.0
Tue - Wed | 135.0
Wed - Thu | 90.0
Thu - Fri | 330.0
Fri - Sat | 180.0
Sat - Sun | 360.0
Sun - Mon | 360.0
>>>