Seite 1 von 1

Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 09:06
von Omm
Hallo zusammen

Ich möchte aus einer Liste(log.txt) das Datum/ die Zeit vergleichen.
log.txt sieht so aus:
Do, 12.04.2018, 17:50:46; xxxxx
Do, 12.04.2018, 17:59:47; yyyyy
Do, 12.04.2018, 18:54:53; gggg
Fr, 13.04.2018, 17:12:30; fffff
Fr, 13.04.2018, 17:32:31; xxx; xx
Fr, 13.04.2018, 17:49:31; xxx; aa
...

Ziel:
return Wert ist dann True/Fals.

Vergleich:
die Zeitstempelung (Zeitstrahl) muss immer später sein. D.h von oben nach unten == später in der Zeitachse. Wenn dem nicht so ist, solle ein Fals zurück kommen.

Kann mir da bitte jemand helfen.

Gruss
Omm

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 09:13
von sls
Was hast du denn bisher versucht, um dein Ziel zu erreichen? Irgendwas programmiert, wenn ja, was hat nicht funktioniert?

Du kannst die Textdatei mit with open zeilenweise einlesen, ist der zu letzt eingelesene Zeitstempel jünger als der aktuelle, kannst du ein False ausliefern. Deiner Beschreibung nach möchtest du schauen, ob die Liste nach Datum absteigend sortiert ist, sprich, jüngster Eintrag ganz unten (?)

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 09:37
von Omm
soweit bin ich gekommen, aber ich bin mir nicht sicher, ob ich nicht generell auf dem Holzweg bin. :)

ja genau, das jüngere Datum nach unten.

def check_lodgatei_datumeintrag_ok(self, logdatei):

zeilenvergleich_datum = list(logdatei)
print(zeilenvergleich_datum)

for i in zeilenvergleich_datum:
zeileneintrag_b = i[4:24]
print(zeileneintrag_b)
j = time.strptime(zeileneintrag_b, "%d.%m.%Y, %H:%M:%S")
i = time.strptime(zeileneintrag_b, "%d.%m.%Y, %H:%M:%S")
print(i,"<-->",j)

status = True

return status

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 10:18
von sls
@Omm: es gibt in deinem Code keine Auswertung, ob der eingelesene Wert der letzten Iteration der aktuell eingelesenen Zeit entspricht, `status` wird also immer True sein. `i` und `j` haben überdies beide den identischen Wert, was du jedoch brauchst ist eine Variable die den Wert des letzten Schleifendurchlaufs beinhaltet, damit er mit dem Zeitstempel des aktuellen Schleifendurchlaufs verglichen werden kann.

`i` als Variablenbezeichner innerhalb des Schleifendurchlaufs sollte überdacht werden, ebenso wie `j`, da sie nicht aussagen wofür die Variablen gedacht sind.

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 11:48
von Omm
ja richtig, die Auswertung kommt nach print, soweit bin ich noch nicht.
d.h. wenn ich es nicht mal schaffe zwei zeilen in einem loop auzulesen, kann ich nicht vergleichen.

bin gerade auf dem Status:

def check_lodgatei_datumeintrag_ok(self, logdatei):
zeilenvergleich_datum = list(logdatei)
naechster_eintrag_in_log = time.strptime(zeilenvergleich_datum[1][4:24], "%d.%m.%Y, %H:%M:%S")

for i in zeilenvergleich_datum:
aktueller_eintrag = time.strptime(i[4:24], "%d.%m.%Y, %H:%M:%S")
if aktueller_eintrag < naechster_eintrag_in_log:
naechster_eintrag_in_log = aktueller_eintrag
print(aktueller_eintrag,"--", naechster_eintrag_in_log, i)
else:
return False

dennoch kommt immer ein False.

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 12:36
von sls
Deinen Code in Python-Tags setzen, das ist sonst kaum zu debuggen.

Lösungsvorschlag:

Code: Alles auswählen

import datetime


def compare_timestamps(logfile):

    last_entry = None

    for date in logfile:
        timestamp = datetime.datetime.strptime(date[4:24],  "%d.%m.%Y, %H:%M:%S")
        if last_entry is not None:
            if last_entry > timestamp:
                return False
        last_entry = timestamp
    return True


with open('test', 'r') as log:
    logfile = log.readlines()

print(compare_timestamps(logfile))
Dieses Beispiel gibt True aus, wenn der jeweils letzte Eintrag kleiner, also "älter" ist als der aktuelle Eintrag. Andernfalls False.

Es besteht kein Bedarf das Logfile in eine Liste zu übergeben.

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 13:57
von Sirius3
sls hat geschrieben: Dienstag 29. Mai 2018, 12:36Es besteht kein Bedarf das Logfile in eine Liste zu übergeben.
Warum machst Du es dann?


Code: Alles auswählen

import datetime
from itertools import tee

def check_timestamps(lines):
    timestamps = (
        datetime.datetime.strptime(line[4:24],  "%d.%m.%Y, %H:%M:%S")
        for line in lines
    )
    timestamps_1, timestamps_2 = tee(w)
    next(timestamps_2)
    return all(t1 > t2 for t1, t2 in zip(timestamps_1, timestamps_2))

with open('test', 'r') as log:
    print(check_timestamps(log))

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 14:18
von sls
Sirius3 hat geschrieben: Dienstag 29. Mai 2018, 13:57 Warum machst Du es dann?
Damit meinte ich das hier:

zeilenvergleich_datum = list(logdatei)

Ja: ich sehe warum eine Liste jetzt überhaupt sinnlos ist.

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 14:29
von kbr
@Sirius3: jetzt noch die Flüchtigkeitsfehler aufräumen: an tee solltest Du timestamps übergeben und da timestamps_2 voraus läuft, wäre t1 < t2 richtig.

Re: Aus Liste Datumsvergleich im Zeitstrahl

Verfasst: Dienstag 29. Mai 2018, 21:50
von Omm
vielen vielen Dank für die Hilfe.
Ich war ja total auf dem Hozweg. :(

nochmals Danke :)