Wie konstruieren eine timedelta-Objekt aus einem einfachen string
Schreibe ich eine Funktion benötigt, die eine timedelta-Eingang übergeben zu werden, als ein string. Der Benutzer eingeben muss, so etwas wie "32m" oder "2h32m", oder sogar "4:13" oder "5hr34m56s"... gibt es eine Bibliothek oder so etwas, das hat so etwas bereits umgesetzt?
Für Menschen, die gerade auf der Suche zum Bau einer timedelta-Objekt von
d
Tagen h
Stunden m
Minuten und s
Sekunden lang mit einer Zeile (nach dem Import datetime
): datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)
.InformationsquelleAutor priestc | 2011-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
für die 4:13, und andere standard-Formate(aber wenn Sie nicht wissen, welche) verwenden dateutil.parser.analysieren von python-dateutil
Für das erste format(5hr34m56s), sollten Sie analysieren mithilfe von regulären Ausdrücken
Hier ist re-basierte Lösung:
Ich fügte hinzu, re-basierte Lösung Beispiel:)
Ich sehe nicht, wie dateutil.parser.analysieren analysieren können Dauer, wie es scheint, gibt immer ein datetime. Was bin ich?
dateutil.parser.parse
nicht analysierentimedelta
Objekte. Es gibt einedatetime
, und es würde eine exception auslösen, für Streicher wie'28:32:11.10'
.InformationsquelleAutor virhilo
Mir die eleganteste Lösung, ohne Rückgriff auf externe Bibliotheken wie dateutil oder manuell Parsen der Eingabe, ist die Verwendung datetime ist leistungsstarke
strptime
string-parsing-Methode.Nach dieser können Sie Ihre timedelta-Objekt als normalerweise, konvertieren Sie es in Sekunden, um sicherzustellen, dass wir die richtige Sache usw.
datetime.strptime("32:20:25","%H:%M:%S")
funktioniert nicht), und Sie müssen wissen, die genaue input-format.Dies auch nur teilweise Antworten, die die OP ' s Frage. Wenn die Funktion benötigt, um sich mit mehreren Formaten - Sie brauchen noch zusätzliche format-Inspektion (1 Doppelpunkt oder 2?).
So, wie der python-3.5, ist es eine elegante Lösung, ohne die Verwendung externer Bibliotheken und ohne die Annahme Zeitspanne von weniger als 24 Stunden?
Ich finde die Notwendigkeit, manuell geben Sie die benannten Parameter für die
timedelta
parameter ziemlich nervig, aber die beste, die ich mit oben kommen kann für, dies zu vermeiden ist:delta = t - datetime.combine(t.date(), time.min)
, das ist...schrecklich.Ein ernstes problem bei diesem Ansatz ist, dass, wenn Sie zählen die Tage, dann senden %d in strptime, wird nicht aktivieren Sie input-Tag 0, als nur Tage >=1 sind gültig für ein Datum.
InformationsquelleAutor metakermit
Hatte ich ein wenig Zeit auf meinen Händen, gestern, so entwickelte ich @virhilo's Antwort in ein Python-Modul, das hinzufügen von ein paar mehr Zeit-Ausdruck-Formate, darunter alle, die angefordert @priestc.
Source code ist auf github (MIT-Lizenz) für jeden, der es will. Es ist auch auf PyPI:
Gibt die Zeit als Anzahl der Sekunden:
InformationsquelleAutor wildwilhelm
Wollte ich Eingangs nur eine Zeit, und dann fügen Sie es zu verschiedenen Terminen, so dass dies für mich gearbeitet:
InformationsquelleAutor kztd
Habe ich geändert virhilo die nette Antwort mit ein paar upgrades:
3m0.25s
3 Minuten, 0,25 Sekunden).
InformationsquelleAutor Peter
Wenn Sie mit Python 3, dann hier die aktualisierte version für Hari Shankar ' s Lösung, die ich verwendet habe:
InformationsquelleAutor Alexey Kislitsin
Django kommt mit der utility-Funktion
parse_duration()
. Aus der Dokumentation:InformationsquelleAutor Don Kirkby