strings und zeit

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
ercmrj
User
Beiträge: 11
Registriert: Freitag 30. Dezember 2011, 07:38

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.
beliar
User
Beiträge: 1
Registriert: Dienstag 27. Dezember 2011, 10:52
Wohnort: Söhlde

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.
Debuggers don't remove bugs, they only show them in slow motion.
ercmrj
User
Beiträge: 11
Registriert: Freitag 30. Dezember 2011, 07:38

Ja, Ich habe für 2 Tage gesucht in datetime, aber ich kan kein Beispiel finden. Von Zeit nach String kan ich finden aber die andere nicht.
deets

Du suchst time.strptime - damit bekommst du ein time-tuple, und das kannst du benutzen um ein datetime.datetime Objekt zu erzeugen.
BlackJack

@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

@BlackJack: hat es? ich schwoere ich habe oft genug danach gesucht... aber es scheint seit 2.5 da zu sein. Danke!
ercmrj
User
Beiträge: 11
Registriert: Freitag 30. Dezember 2011, 07:38

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

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.
problembär

Bei mir unter Python 2.4 geht folgendes:

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
(Noch nicht klar ist mir, wie man tzinfo (t[7]) auch noch einbindet.)
ercmrj
User
Beiträge: 11
Registriert: Freitag 30. Dezember 2011, 07:38

Wunderbar, vielen Dank.

Das ist genau was ich suche.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
problembär

Dav1d hat geschrieben:@problembär, meinst du nicht 2.4 ist etwas alt?
Schon, läuft aber immer noch gut.
Dav1d hat geschrieben:Außerdem entspricht dein Code nicht der PEP-8
Na und, PEP-8 kann mich mal.

So wie oben dargestellt klappt das bei dem OP, und es ist auch das, was er sucht.
deets

@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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
Anscheinend …
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

deets hat geschrieben:... aber verhindern kann man's halt nicht.
Wir können es immerhin anprangern und unmittelbar widersprechen; somit hat der Neuling immerhin die Chance, der dunklen Seite der Macht zu widerstehen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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:

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"))
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.
ercmrj
User
Beiträge: 11
Registriert: Freitag 30. Dezember 2011, 07:38

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
Antworten