假设我们有一个名为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
小时。
需要帮助来解决问题。如果我的整个代码错误或不方便,请提供解决问题的最佳方法。
答案 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
>>>