Einen Zeitraum in einer Datetime-Liste finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo zusammen,

ich habe eine Liste mit verschiedenen Zeitpunkten, die als Datumsobjekte vorliegen (datetime). Wenn ich nun als Zeitvorgabe das Datumsobjekt "datetime.datetime(2011, 8, 16, 3, 0)" bekomme, muss ich einen Zeitraum in der vorliegenden Liste finden, in dem es keinen anderen Zeitpunkt 10 Minuten davor bzw. danach gibt. Die Liste wäre zB diese:
[datetime.datetime(2011, 8, 16, 1, 15), datetime.datetime(2011, 8, 16, 2, 52), datetime.datetime(2011, 8, 16, 3, 0), datetime.datetime(2011, 8, 16, 3, 5)]
Ich kann allerdings ab meinem Zeitpunkt nur vorwärts rechnen. Das bedeutet in diesem konkreten Beispiel, dass ich ab "datetime.datetime(2011, 8, 16, 3, 0)" rechnend dann auf den Zeitpunkt "datetime.datetime(2011, 8, 16, 3, 16)" komme - was dann eben die Lösung wäre.

Wie kann ich das aber ausrechnen?

(Ich hoffe, das war jetzt nicht zu kompliziert ausgedrückt?!) :?

CU,
API
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ich hoffe mal, dass ich deine Problembeschreibung richtig verstanden habe: Du hast eine sortierte Liste L mit Daten und hast nun ein Weiteres Datum x. Nun müchtest du testen, ob in L ein Element liegt, welches näher als +/- 10 Minuten an x dran liegt.

Dazu würde ich das bisect-Modul verwenden und prüfen, an welche Stelle du das Element in die Liste einfügen müsstest. Hat diese Stelle den Index i, dann testest du einfach die Element i-1 und i+1, falls diese denn existieren.

Sebastian
Das Leben ist wie ein Tennisball.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo Sebastian,

das ist schonmal ne gute Möglichkeit rauszufinden, an welcher Stelle ich aufsetzen sollte.

Ich werd mal nen bischen weiterbasteln. Danke dir. :D

CU,
API
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oh, kleiner Flüchtigkeitsfehler: Wenn du nicht in die Liste einfügst, sondern bei i einfügen müsstest, dann musst du natürlich die Elemente i-1 und i testen und nicht, wie oben beschrieben, i-1 und i+1. Das wäre dir aber wahrscheinlich aufgefallen.
Das Leben ist wie ein Tennisball.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Ja, ist mir aufgefallen - ansonsten bin ich ja einen zu weit... :wink:

Übrigens, dass mit dem bisect kannte ich nicht - ist aber wirklich nützlich... :D
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

kann gut sein, dass ich nicht wirklich verstanden habe, was Du lösen möchtest... vielleicht lieg' ich also komplett daneben!

Inspiriert von Deinem Thread habe ich mal folgendes gebastelt (siehe auch diesen Thread):

Code: Alles auswählen

class DateTime(datetime):
    def __new__(cls, *args, **kwargs):
        new_datetime = datetime.__new__(cls, *args)
        return new_datetime

class TimeRange(DateTime):
    def __init__(self, *args, **kwargs):
    '''left <int> and right <int> in minutes'''
        self.left = self - timedelta(seconds=kwargs.get('left', 0)*60)
        self.right = self + timedelta(seconds=kwargs.get('right', 0)*60)

    def __contains__(self, date):
        return self.left < date < self.right

In [83]: tr = TimeRange(2011, 8, 16, 12, 0, left=10, right=10)

In [84]: datetime(2011, 8, 16, 12, 10) in tr
Out[84]: False

In [85]: datetime(2011, 8, 16, 12, 9) in tr
Out[85]: True

In [86]: datetime(2011, 8, 16, 11, 50) in tr
Out[86]: False

In [87]: datetime(2011, 8, 16, 11, 51) in tr
Out[87]: True
Darüber, ob man '__contains__' überschreibt oder zur Prüfung eine extra Methode macht, kann man sicherlich noch streiten...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten