Pythonzeitintervallalgorithmus sum

Angenommen, ich habe 2 Zeitintervalle, wie 16:30 – 20:00 UND 15:00 – 19:00, ich muss die Gesamtzeit zwischen diesen beiden Intervallen finden, so dass das Ergebnis 5 Stunden ist (ich füge beide Intervalle hinzu und subtrahiere die Überschneidungsintervall), wie kann ich eine generische Funktion schreiben, die auch alle Fälle wie ein Intervall im anderen (also das Ergebnis ist das Intervall der größeren), keine Kreuzung (also das Ergebnis ist die Summe der beiden Intervalle).

Meine eingehende Datenstruktur ist primitiv, einfach String wie "15:30", so dass eine Umwandlung erforderlich sein kann.

Vielen Dank

4 Solutions collect form web for “Pythonzeitintervallalgorithmus sum”

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 

Testen Sie mit Ihren Zeiten aus der Frage:

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

Das druckt:

 5:00:00 

Testen Sie es 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 

Ich nehme an, Sie können die Umwandlung auf etwas wie datetime auf eigene Faust zu tun.

Summe die beiden Intervalle, dann subtrahiere jede Überlappung. Sie können die Überlappung durch Vergleich der min und max von jedem der beiden Bereiche zu bekommen.

Code für wenn es eine Überlappung gibt, fügen Sie es bitte zu einer Ihrer Lösungen hinzu:

 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 

Du willst deine Strings in datetimes umwandeln. Sie können dies mit datetime.datetime.strptime tun.

Wenn Intervalle von datetime.datetime Objekten datetime.datetime , wenn die Intervalle sind:

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

Dann ist es nicht nur:

 if end1 < start2 or end2 < start1: # The intervals are disjoint. return (end1-start1) + (end2-start2) else: return max(end1, end2) - min(start1, start2) 
Python ist die beste Programmiersprache der Welt.