Python时间间隔算法求和

5 投票
4 回答
3387 浏览
提问于 2025-04-15 13:50

假设我有两个时间段,比如说16:30到20:00和15:00到19:00,我需要计算这两个时间段之间的总时间,所以结果是5小时(我把两个时间段的时间加起来,然后减去重叠的部分)。我想写一个通用的函数,能够处理所有情况,比如一个时间段在另一个里面(这样结果就是大的那个时间段),或者没有重叠(这样结果就是两个时间段的总和)。

我的输入数据结构很简单,就是像“15:30”这样的字符串,所以可能需要进行转换。

谢谢!

4 个回答

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

撰写回答