2009-08-24 193 views
3

假设我有两个时间间隔,例如16:30 - 20:00和15:00 - 19:00,我需要找到这两个时间间隔之间的总时间,所以结果是5小时(我加上两个区间并减去相交区间),我该如何编写一个通用函数,该函数还处理所有情况,例如一个区间内的其他区域(所以结果是大区间的区间),没有交点(所以结果是两个区间的总和)。python时间间隔算法总和

我的传入数据结构是原始的,只是字符串像“15:30”,所以可能需要转换。

感谢

回答

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 
+0

如果没有重叠不工作。 – 2009-08-24 21:23:32

0

我假设你可以做转换到你自己像datetime

总结两个间隔,然后减去任何重叠。您可以通过比较两个范围中的每个范围的最小值和最大值来获得重叠。

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 
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)