Ich habe eine Textfile und in jede Zeile ist eine Zeit.
Jetzt ist es mir gelungen um die Zeit aus jedem Zeile heraus zu nehmen aber wie kan ich damit rechnen.
Zum beispiel "09:15:27" - "08:04:13" = 01:11:14
Ist es notwendig um die Uhren, Minuten und Seconden zu trennen oder ist da einen einfacheren Weg.
strings und zeit
Mit den strings alleine kann man nicht rechnen, aber python bietet Klassen an die eine Zeit repräsentieren und mit denen gerechnet werden kann.
Diese Klassen können auch einen String parsen, welcher z.B. aus einer Datei ausgelesen wurde.
Ein Beispiel ist die datetime Klasse aus dem datetime modul.
Diese Klassen können auch einen String parsen, welcher z.B. aus einer Datei ausgelesen wurde.
Ein Beispiel ist die datetime Klasse aus dem datetime modul.
Debuggers don't remove bugs, they only show them in slow motion.
Du suchst time.strptime - damit bekommst du ein time-tuple, und das kannst du benutzen um ein datetime.datetime Objekt zu erzeugen.
@ercmrj: Die Methode dafür heisst `strptime()`. In der Dokumentation zu dieser Methode steht zu was der Aufruf äquivalent ist. Wenn man bei der dort verwendeten Funktion in der Dokumentation nachliest, findet man ein Beispiel und den Hinweis auf die Umkehrfunktion wo dann auch die möglichen Platzhalter beschrieben werden.
@deets: `datetime` hat eine statische Methode `strptime()`.
@deets: `datetime` hat eine statische Methode `strptime()`.
@BlackJack: hat es? ich schwoere ich habe oft genug danach gesucht... aber es scheint seit 2.5 da zu sein. Danke!
Dieses Beispiel habe ich gefunden:
import time
print time.strptime("Tue Jun 16 20:18:03 1981")
aber dan bekomme ich:
time.struct_time(tm_year=1981, tm_mon=6, tm_mday=16, tm_hour=20, tm_min=18, tm_sec=3, tm_wday=1, tm_yday=167, tm_isdst=-1)
Wie setzen ich jetzt die value(z.b. tm_min=18) in einer separaten Variablen.
Und jetzt muss ich immer noch alles umrechnen nach Secunden und zuruck.
import time
print time.strptime("Tue Jun 16 20:18:03 1981")
aber dan bekomme ich:
time.struct_time(tm_year=1981, tm_mon=6, tm_mday=16, tm_hour=20, tm_min=18, tm_sec=3, tm_wday=1, tm_yday=167, tm_isdst=-1)
Wie setzen ich jetzt die value(z.b. tm_min=18) in einer separaten Variablen.
Und jetzt muss ich immer noch alles umrechnen nach Secunden und zuruck.
BlackJack hat mich ja korrigiert - es gibt diese Methode auch direkt auf datetime.datetime - sieht genauso aus. Schau bitte in die Doku des datetime Moduls.
Bei mir unter Python 2.4 geht folgendes:
(Noch nicht klar ist mir, wie man tzinfo (t[7]) auch noch einbindet.)
Code: Alles auswählen
#!/usr/bin/python
# coding: iso-8859-1
import time
import datetime
def strptimeToDatetime(s):
t = time.strptime(s)
return datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5], t[6])
d = strptimeToDatetime("Tue Jun 16 20:18:03 1981")
print d
d2 = strptimeToDatetime("Fri Dec 30 09:15:27 2011")
d3 = strptimeToDatetime("Fri Dec 30 08:04:13 2011")
print d2 - d3
Nein das suchst du _nicht_, du suchst http://docs.python.org/library/datetime ... e.strptime. Außerdem passt man normalerweise noch einen Format-String.
@problembär, meinst du nicht 2.4 ist etwas alt? Außerdem entspricht dein Code nicht der PEP-8
@problembär, meinst du nicht 2.4 ist etwas alt? Außerdem entspricht dein Code nicht der PEP-8
the more they change the more they stay the same
Schon, läuft aber immer noch gut.Dav1d hat geschrieben:@problembär, meinst du nicht 2.4 ist etwas alt?
Na und, PEP-8 kann mich mal.Dav1d hat geschrieben:Außerdem entspricht dein Code nicht der PEP-8
So wie oben dargestellt klappt das bei dem OP, und es ist auch das, was er sucht.
@Dav1d
problembaer macht sich einen Spass daraus, veralteten und unpythonischen Code zu schreiben. Es ist natuerlich schade, dass er damit Neulingen schlechten Stil beibringt - aber verhindern kann man's halt nicht.
problembaer macht sich einen Spass daraus, veralteten und unpythonischen Code zu schreiben. Es ist natuerlich schade, dass er damit Neulingen schlechten Stil beibringt - aber verhindern kann man's halt nicht.
@ercmrj: Die folgenden Lösung ist vermutlich etwas übersichtlicher:
Code: Alles auswählen
import datetime
d1 = datetime.datetime.strptime('08:04:13', '%H:%M:%S')
d2 = datetime.datetime.strptime('09:15:27', '%H:%M:%S')
print d2 - d1
Anscheinend …deets hat geschrieben:@Dav1d
problembaer macht sich einen Spass daraus, veralteten und unpythonischen Code zu schreiben. Es ist natuerlich schade, dass er damit Neulingen schlechten Stil beibringt - aber verhindern kann man's halt nicht.
the more they change the more they stay the same
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wir können es immerhin anprangern und unmittelbar widersprechen; somit hat der Neuling immerhin die Chance, der dunklen Seite der Macht zu widerstehendeets hat geschrieben:... aber verhindern kann man's halt nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Da eine gute Antwort ja schon gegeben wurde, erlaube ich mir folgende Frage: Wieso sucht man zwei Tage (also 16 Stunden?) lang (vergeblich) nach einer Lösung, wenn es wesentlich schneller geht, das Problem lieber selbst zu lösen? Es ist ja OK, eine fertige Lösung aus der Standard-Bibliothek zu verwenden, wenn man dadurch Zeit spart, aber irgendwann sollte der Pragmatismus einsetzen und dann macht man's eben selbst.
Zum Beispiel so:
Einen String aus drei Zahlen durch ":" getrennten Zahlen kann auch ein Anfänger in einen Sekundenwert umwandeln, wenn vielleicht auch nicht so elegant, wie ich meinen Einzeiler mit dem Mappen von int auf die drei Teilstrings finde. Das eine Minute 60 Sekunden hat und eine Stunde 60 Minuten sollte aber ja wohl Grundwissen sein. Und dann kann man mit Hilfe von Division und Modulo-Operationen auch daraus wieder Stunden und Minuten und Sekunden machen (ich benutze // statt / weil der in jeder Python-Version einen int als Ergebnis hat). Das ist einfache Mathematik. Jetzt muss man noch wissen, wie mit mit einem Format-String eine zweistellige Zahl mit führenden Nullen hinbekommt oder wieder ein paar mehr Zeilen benutzen. Doch alles in allem kann das nicht länger dauern als 10 Minuten, wenn man den Algorithmus kennt.
Spätestens nach 30 Minuten Suche würde ich daher abbrechen und es lieber selbst machen.
Stefan
PS: Nun kann man sich natürlich fragen, was passieren soll, wenn ich eine negative Anzahl von Sekunden anzeigen will, und so was macht dann eine eigene Lösung doch aufwendiger. Da bricht dann leider mein Format-String, aber ich überlasse es dem Leser, das zu korrigieren.
Zum Beispiel so:
Code: Alles auswählen
def parse_time(ts):
h, m, s = map(int, ts.split(":"))
return ((h * 60) + m) * 60 + s
def format_time(tm):
return "%02d:%02d:%02d" % (tm // 3600, (tm % 3600) // 60, tm % 60)
print format_time(parse_time("09:15:27") - parse_time("08:04:13"))
Spätestens nach 30 Minuten Suche würde ich daher abbrechen und es lieber selbst machen.
Stefan
PS: Nun kann man sich natürlich fragen, was passieren soll, wenn ich eine negative Anzahl von Sekunden anzeigen will, und so was macht dann eine eigene Lösung doch aufwendiger. Da bricht dann leider mein Format-String, aber ich überlasse es dem Leser, das zu korrigieren.
Noch mal danke für die viele Antworte.
Ich kann das Problem lösen ohne die datetime klasse, aber ich möchte auch mehr erfahren über Pyhton.
Und jetzt nach dem vielen sucharbeit weiss ich auch besser wie ich der Dokumentation verwenden müss
Ich kann das Problem lösen ohne die datetime klasse, aber ich möchte auch mehr erfahren über Pyhton.
Und jetzt nach dem vielen sucharbeit weiss ich auch besser wie ich der Dokumentation verwenden müss