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.

  • Vergleichen Sie den aktuellen Pixelwert mit dem vorherigen auf numpy array
  • Konvertieren eines Mercurial (hg) Repository zu Git auf Windows (7)
  • Versuchen Sie, Chrom-Treiber auf Linux mit Selen-Webdriver zu starten
  • Konvertieren von String in Bild in Python
  • Warum kann ich nicht japanische Zeichen an der Eingabeaufforderung in Python3 eingeben?
  • JQ kann nicht über PIP installiert werden
  • Vielen Dank

  • TypeError: Ausnahmen müssen alte Klassen sein oder von BaseException abgeleitet werden, nicht Str
  • Matplotlib: Warnung vor matplotlib.use entfernen ()
  • Hochleistungsvariable Unschärfe in sehr großen Bildern mit Python
  • Python - re.split: extra leere Strings, die die Anfangs- und Endliste haben
  • S3-boto- list Dateien innerhalb eines Eimers durch Upload-Zeit
  • Erkennung von mouseover ein Bild in Pygame
  • 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.