Seite 1 von 1

Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Montag 15. August 2011, 15:42
von api
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

Re: Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Montag 15. August 2011, 16:06
von EyDu
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

Re: Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Montag 15. August 2011, 16:24
von api
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

Re: Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Montag 15. August 2011, 16:48
von EyDu
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.

Re: Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Montag 15. August 2011, 17:44
von api
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

Re: Einen Zeitraum in einer Datetime-Liste finden

Verfasst: Dienstag 16. August 2011, 13:43
von mutetella
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