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.
datum und zeit vergleichen
Schau mal im `time`-Modul, speziell `strptime()` und `mktime()` wenn Du *eine* Zahl statt eines Tupels haben möchtest.
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.
-
- User
- Beiträge: 21
- Registriert: Mittwoch 9. März 2005, 11:40
- Wohnort: Altena, Westf.
- Kontaktdaten:
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)
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
Roland
-
- User
- Beiträge: 21
- Registriert: Mittwoch 9. März 2005, 11:40
- Wohnort: Altena, Westf.
- Kontaktdaten:
Sorry in meinem Beispiel hat sich ein kleiner Fehler eingeschlichen. Soll natürlich
heissen.
Aber nichts desto trotz. Der Rückgabewert ist bei verschiedenen Datum und Zeiten immer der gleiche. Irgendwas mache ich falsch.
Code: Alles auswählen
time.mktime(time.strptime(z[:15],'%b %d %H:%M:%S'))
Aber nichts desto trotz. Der Rückgabewert ist bei verschiedenen Datum und Zeiten immer der gleiche. Irgendwas mache ich falsch.
cu
Roland
Roland
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.
Ich hab keine einfache Methode gefunden, um direkt vom String zu Datetime zu parsen, prinzipiell müsste aber gehen:
Code: Alles auswählen
from datetime import datetime
weihnachten = datetime(2006,12,24)
sylvester = datetime(2006,12,31)
print sylvester < weihnachten
print sylvester - weihnachten
Code: Alles auswählen
(year, month, day, hour, min, sec, x, y, z) = strptime(strdate, format)
d = datetime(year, month, day, hour, min, sec)
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.rkruggel hat geschrieben:Sorry in meinem Beispiel hat sich ein kleiner Fehler eingeschlichen. Soll natürlichheissen.Code: Alles auswählen
time.mktime(time.strptime(z[:15],'%b %d %H:%M:%S'))
Aber nichts desto trotz. Der Rückgabewert ist bei verschiedenen Datum und Zeiten immer der gleiche. Irgendwas mache ich falsch.
`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
-
- User
- Beiträge: 21
- Registriert: Mittwoch 9. März 2005, 11:40
- Wohnort: Altena, Westf.
- Kontaktdaten:
@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?
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
Roland
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.rkruggel hat geschrieben:Der unterschied zwischen 1900 und 1970; ist das ein bug im Python?
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