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.

  • Fehler beim Laden des MySQLdb-Moduls: libmysqlclient.so.20: kann keine freigegebene Objektdatei öffnen: Keine solche Datei oder ein Verzeichnis
  • Getting 'int' Objekt ist nicht iterable
  • Build-Fehler während der Installation von py25-gtk unter Mac OS X 10.6 mit MacPorts 1.8
  • Selen Python bekommen alle Kinder Elemente
  • PyQt: Entfernen von unnötigen Spalten
  • Zusammenführen von zwei Netzwerkkarten in networkx durch eindeutige Labels
  • Vielen Dank

  • Scrapy: Wie manuell eine Anforderung von einem Spider_idle-Event-Callback einfügt?
  • Kopieren von xlsx zu einem bestimmten Blatt in einem anderen xlsx
  • Python: wollen Ausnahme fangen, aber weiß nicht woher kommt es?
  • Wie schreibe ich ein Python-Modul?
  • Wie man eine Python, Kommandozeilen-Programm autocomplete willkürliche Dinge nicht Dolmetscher machen
  • Installieren von lxml, libxml2, libxslt unter Windows 8.1
  • 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.