假设我有2个时间间隔,例如16:30 - 20:00和15:00 - 19:00,我需要找到这两个间隔之间的总时间,所以结果是5个小时(我添加两个间隔并且减去交叉间隔),我怎么能写一个通用函数,它也处理所有情况,例如其他内部的一个区间(所以结果是较大区间的间隔),没有交集(所以结果是两者的总和)间隔)。
我的传入数据结构是原始的,只是像“15:30”这样的字符串,因此可能需要进行转换。
由于
答案 0 :(得分:3)
from datetime import datetime, timedelta
START, END = xrange(2)
def tparse(timestring):
return datetime.strptime(timestring, '%H:%M')
def sum_intervals(intervals):
times = []
for interval in intervals:
times.append((tparse(interval[START]), START))
times.append((tparse(interval[END]), END))
times.sort()
started = 0
result = timedelta()
for t, type in times:
if type == START:
if not started:
start_time = t
started += 1
elif type == END:
started -= 1
if not started:
result += (t - start_time)
return result
从问题中测试你的时间:
intervals = [
('16:30', '20:00'),
('15:00', '19:00'),
]
print sum_intervals(intervals)
打印:
5:00:00
与不重叠的数据一起测试
intervals = [
('16:30', '20:00'),
('15:00', '19:00'),
('03:00', '04:00'),
('06:00', '08:00'),
('07:30', '11:00'),
]
print sum_intervals(intervals)
结果:
11:00:00
答案 1 :(得分:0)
我假设您可以自行转换为datetime。
将两个间隔相加,然后减去任何重叠。您可以通过比较两个范围中每个范围的最小值和最大值来获得重叠。
答案 2 :(得分:0)
重叠时的代码,请将其添加到您的某个解决方案中:
def interval(i1, i2):
minstart, minend = [min(*e) for e in zip(i1, i2)]
maxstart, maxend = [max(*e) for e in zip(i1, i2)]
if minend < maxstart: # no overlap
return minend-minstart + maxend-maxstart
else: # overlap
return maxend-minstart
答案 3 :(得分:0)
您需要将字符串转换为日期时间。您可以使用datetime.datetime.strptime
。
给定datetime.datetime
个对象的间隔,如果间隔为:
int1 = (start1, end1)
int2 = (start2, end2)
然后不只是:
if end1 < start2 or end2 < start1:
# The intervals are disjoint.
return (end1-start1) + (end2-start2)
else:
return max(end1, end2) - min(start1, start2)