datum und zeit vergleichen

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
rkruggel
User
Beiträge: 21
Registriert: Mittwoch 9. März 2005, 11:40
Wohnort: Altena, Westf.
Kontaktdaten:

Freitag 1. Dezember 2006, 12:27

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.
cu
Roland
BlackJack

Freitag 1. Dezember 2006, 13:02

Schau mal im `time`-Modul, speziell `strptime()` und `mktime()` wenn Du *eine* Zahl statt eines Tupels haben möchtest.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Freitag 1. Dezember 2006, 13:27

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.
rkruggel
User
Beiträge: 21
Registriert: Mittwoch 9. März 2005, 11:40
Wohnort: Altena, Westf.
Kontaktdaten:

Freitag 1. Dezember 2006, 13:31

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'))
cu
Roland
rkruggel
User
Beiträge: 21
Registriert: Mittwoch 9. März 2005, 11:40
Wohnort: Altena, Westf.
Kontaktdaten:

Freitag 1. Dezember 2006, 15:13

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.
cu
Roland
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Freitag 1. Dezember 2006, 15:32

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)
BlackJack

Freitag 1. Dezember 2006, 17:05

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.
rkruggel
User
Beiträge: 21
Registriert: Mittwoch 9. März 2005, 11:40
Wohnort: Altena, Westf.
Kontaktdaten:

Freitag 1. Dezember 2006, 17:41

@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?
cu
Roland
BlackJack

Freitag 1. Dezember 2006, 18:20

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.
Antworten