2009-08-24 24 views
3

Angenommen, ich habe 2 Zeitintervalle, wie 16:30 - 20:00 UND 15:00 - 19:00, muss ich die Gesamtzeit zwischen diesen beiden Intervallen finden, so dass das Ergebnis 5 Stunden ist (Ich füge beide Intervalle hinzu und subtrahiere das überschneidende Intervall), wie kann ich eine generische Funktion schreiben, die auch alle Fälle behandelt, wie ein Intervall innerhalb eines anderen (also das Ergebnis ist das Intervall des größeren), kein Schnittpunkt (also das Ergebnis ist die Summe beider Intervalle).python Zeitintervall Algorithmus Summe

Meine ankommende Datenstruktur ist primitiv, einfach wie "15:30", so dass eine Konvertierung erforderlich sein kann.

Dank

Antwort

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 

Testing mit Zeiten von der Frage:

intervals = [ 
       ('16:30', '20:00'), 
       ('15:00', '19:00'), 
      ] 
print sum_intervals(intervals) 

der Drucke:

5:00:00 

Testing zusammen mit Daten, die nicht überlappen

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) 

Ergebnis :

11:00:00 
+0

funktioniert nicht, wenn keine Überlappung ist. –

0

Ich nehme an, Sie die Umstellung auf so etwas wie datetime auf eigene Faust zu tun.

Die zwei Intervalle summieren, dann jede Überlappung abziehen. Sie können die Überlappung erhalten, indem Sie die Min- und Max-Werte für jeden der beiden Bereiche vergleichen.

0

-Code für, wenn es eine Überlappung, um es zu einem Ihrer Lösungen fügen Sie bitte:

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

Sie werden Ihre Strings in Datetimes konvertieren möchten. Sie können dies mit datetime.datetime.strptime tun.

Bei Abständen von datetime.datetime Objekte, wenn die Intervalle sind:

int1 = (start1, end1) 
int2 = (start2, end2) 

Dann einfach nicht ist:

es
if end1 < start2 or end2 < start1: 
    # The intervals are disjoint. 
    return (end1-start1) + (end2-start2) 
else: 
    return max(end1, end2) - min(start1, start2)