2015-10-23 71 views
-2

我已经持续时间表示为一对datetime对象的这样Python - 如何查找日期时间重叠?

(datetime(2014, 1, 23, 14, 49, 6, 185955), datetime(2015, 4, 18, 14, 49, 6, 185955)) 

我有这样

[(datetime(2014, 1, 23, 14, 49, 6, 185955), datetime(2015, 4, 18, 14, 49, 6, 185955)), (datetime(2015, 2, 2, 14, 49, 6, 185955), datetime(2015, 10, 23, 14, 49, 6, 185955)),] 

现在我怎样计算的(小时方面的重叠的持续时间这样的元组的列表,分,秒)列表中的所有持续时间(这里是一对日期时间对象)?

E.g:

A  C    B   D G E   H I  J F 
|-----------------------| 
     |--------------------------| 
              |-----------------------| 
             |--------------| |-----| 

这里AB,CD是对datetime对象的。在 列表中,如何在(小时,分钟,秒)方面获得重叠CB?

+3

有可能什么你已经尝试过自己,你可以与我们分享?如果它不起作用,那很好,那么我们可以看看如何改进它 –

+0

那么只需从B中减去C?尝试这个。 – Noxeus

回答

0

试试这个:

from datetime import datetime 
t = [(datetime(2014, 1, 23, 14, 49, 6, 185955), datetime(2015, 4, 18, 14, 49, 6, 185955)), (datetime(2015, 2, 2, 14, 49, 6, 185955), datetime(2015, 10, 23, 14, 49, 6, 185955))] 
def time_overlap(t): 
    overlap = (min(t[0][1], t[1][1]) - max(t[0][0], t[1][0])) 
    days = overlap.days+1 
    hours, remainder = divmod(overlap.seconds, 3600) 
    minutes, seconds = divmod(remainder, 60) 
    hours += days*24 
    return (hours,minutes,seconds) 
print(time_overlap(t)) 

输出:

(1824, 0, 0) 

要找到多个日期时间重叠,这样做:

from datetime import datetime 
t = [(datetime(2014, 1, 23, 14, 49, 6, 185955), datetime(2015, 4, 18, 14, 49, 6, 185955)), (datetime(2015, 2, 2, 14, 49, 6, 185955), datetime(2015, 10, 23, 14, 49, 6, 185955))] 
def time_overlap(t): 
    overlap = (min([x[1] for x in t]) - max([x[0] for x in t])) 
    days = overlap.days+1 
    hours, remainder = divmod(overlap.seconds, 3600) 
    minutes, seconds = divmod(remainder, 60) 
    hours += days*24 
    return (hours,minutes,seconds) 
print(time_overlap(t))