python时间间隔算法和

时间:2009-08-24 20:59:26

标签: python time intervals

假设我有2个时间间隔,例如16:30 - 20:00和15:00 - 19:00,我需要找到这两个间隔之间的总时间,所以结果是5个小时(我添加两个间隔并且减去交叉间隔),我怎么能写一个通用函数,它也处理所有情况,例如其他内部的一个区间(所以结果是较大区间的间隔),没有交集(所以结果是两者的总和)间隔)。

我的传入数据结构是原始的,只是像“15:30”这样的字符串,因此可能需要进行转换。

由于

4 个答案:

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