Seite 1 von 1

datum und zeit vergleichen

Verfasst: Freitag 1. Dezember 2006, 12:27
von rkruggel
Hallo,

manchmal hängt es an ganz trivialen Dingen. Ich will ein bekanntes Datum im Ascii format (z.b. Dec 01 12:25:35) mit dem Datum in einem Logfile vergleichen. Ich muss jetzt das Datum in einen Wert umwandeln der vergleichbar ist.

Ich habs nicht gefunden. :(
Bitte einen kurzen Tip.

Verfasst: Freitag 1. Dezember 2006, 13:02
von BlackJack
Schau mal im `time`-Modul, speziell `strptime()` und `mktime()` wenn Du *eine* Zahl statt eines Tupels haben möchtest.

Verfasst: Freitag 1. Dezember 2006, 13:27
von Y0Gi
Entweder wandelst du die zu vergleichenden Daten in Timestamps (über o.g. Funktionen), also Integer mit der Anzahl der seit Beginn der Unix-Epoche vergangenen Sekunden, oder noch weiter in datetime-Instanzen (aus dem gleichnamigen Modul) um, die du dann vergleichen kannst.

Verfasst: Freitag 1. Dezember 2006, 13:31
von rkruggel
Das habe ich versucht. Allerdings kommt alles möglich dabei raus nur nichts definiertes was man vergleichen kann. Ein kleineres Datum/Zeit bekommt tlw einen größeren timestamp.

Diese Funtionen habe ich benutzt.
(in z:[:15] ist das Datum in der form 'Dec 01 13:30:41' drin)

Code: Alles auswählen

time.mktime(time.strptime(z[:15],'%b %d %H:%M:%y'))

Verfasst: Freitag 1. Dezember 2006, 15:13
von rkruggel
Sorry in meinem Beispiel hat sich ein kleiner Fehler eingeschlichen. Soll natürlich

Code: Alles auswählen

time.mktime(time.strptime(z[:15],'%b %d %H:%M:%S')) 
heissen.

Aber nichts desto trotz. Der Rückgabewert ist bei verschiedenen Datum und Zeiten immer der gleiche. Irgendwas mache ich falsch.

Verfasst: Freitag 1. Dezember 2006, 15:32
von keppla
Zum Rechnen mit Zeiten nimmt man imho in python am besten die Klassen Date, Datetime und TimeDelta, die im modul Datetime sind. Man kann sie (wo es sinnvoll ist) direkt vergleichen und mit ihnen rechnen.

Code: Alles auswählen

from datetime import datetime

weihnachten = datetime(2006,12,24)
sylvester = datetime(2006,12,31)

print sylvester < weihnachten
print sylvester - weihnachten
Ich hab keine einfache Methode gefunden, um direkt vom String zu Datetime zu parsen, prinzipiell müsste aber gehen:

Code: Alles auswählen

(year, month, day, hour, min, sec, x, y, z)  = strptime(strdate, format)
d = datetime(year, month, day, hour, min, sec)

Verfasst: Freitag 1. Dezember 2006, 17:05
von BlackJack
rkruggel hat geschrieben:Sorry in meinem Beispiel hat sich ein kleiner Fehler eingeschlichen. Soll natürlich

Code: Alles auswählen

time.mktime(time.strptime(z[:15],'%b %d %H:%M:%S')) 
heissen.

Aber nichts desto trotz. Der Rückgabewert ist bei verschiedenen Datum und Zeiten immer der gleiche. Irgendwas mache ich falsch.
Schau Dir mal das Zwischenergebnis an: Die Jahreszahl im Tupel ist 1900. Das scheint der Vorgabewert zu sein, wenn das Jahr in der Zeichenkette nicht angegeben wird.

`mktime()` liefert die Anzahl der Sekunden seit "Epoch", das ist auf Unix-Rechnern üblicherweise 1970-01-01 um 00:00 Uhr. Der Vorkommaanteil wird aus einem C `int` gebildet, ist also in seinem Wertebereich begrenzt und das Jahr 1900 ist in Sekunden einfach zu weit von 1970 entfernt als dass dieser Wert noch in ein C `int` passen würde. Also gibt's immer den maximalen Wert:

Code: Alles auswählen

In [29]: z = 'Dec 01 13:30:41'

In [30]: time.mktime(time.strptime(z[:15],'%b %d %H:%M:%S'))
Out[30]: -2147483648.0

In [31]: sys.maxint
Out[31]: 2147483647
Du müsstest also ein Jahr einfügen, das nicht so weit von 1970 entfernt ist.

Verfasst: Freitag 1. Dezember 2006, 17:41
von rkruggel
@keppla
Das funktioniert.

@Blackjack
Das funktioniert auch.
Jetzt wo du das so beschreibst ist es einleuchtend. Mein einer Jahreszahl davor bekomme ich auch einen vernünftigen wert den ich vergleichen kann.

Ich danke euch. Ihr habt mir geholfen. Bin wieder um einiges Schlauer geworden, vor allen Dingen sind die Hintergründe transparent.

Der unterschied zwischen 1900 und 1970; ist das ein bug im Python?

Verfasst: Freitag 1. Dezember 2006, 18:20
von BlackJack
rkruggel hat geschrieben:Der unterschied zwischen 1900 und 1970; ist das ein bug im Python?
Hm, man könnte sagen das Python hier eine Ausnahme auslösen müsste. Negative Zeiten sind in POSIX gar nicht definiert bzw. die -1 zeigt in der entsprechenden C-Funktion einen Fehler an.

70 Jahre sind halt etwas zuviel für ein C `int`. Aber gar nicht mal so viel zu viel:

Code: Alles auswählen

In [35]: 70 * 356 * 24 * 60 * 60
Out[35]: 2153088000L

In [36]: sys.maxint
Out[36]: 2147483647

In [37]: sys.maxint - _35
Out[37]: -5604353L
Besser/Genauer fährt man auf jeden Fall mit den `datetime`-Objekten.