Ich habe Probleme beim Formatieren eines datetime.timedelta
Objekts.
Folgendes versuche ich zu tun: Ich habe eine Liste von Objekten und eines der Mitglieder der Klasse des Objekts ist ein Zeitdelta-Objekt, das die Dauer eines Ereignisses anzeigt. Ich möchte diese Dauer im Format Stunden: Minuten anzeigen.
Ich habe verschiedene Methoden ausprobiert, um dies zu tun, und ich habe Schwierigkeiten. Mein aktueller Ansatz besteht darin, der Klasse Methoden für meine Objekte hinzuzufügen, die Stunden und Minuten zurückgeben. Ich kann die Stunden erhalten, indem ich das timedelta.seconds durch 3600 dividiere und runde. Ich habe Probleme, die restlichen Sekunden zu bekommen und diese in Minuten umzuwandeln.
Übrigens verwende ich Google AppEngine mit Django-Vorlagen für die Präsentation.
datetime.utcfromtimestamp()
. Siehe meine Antwort unten.__str__
vontimedelta
ganz anständig im Gegensatz zu__repr__
(das heißt - für Menschen!). Zum Beispiel:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48
gibtdatetime.timedelta(seconds=21871, microseconds=208333)
, aberstr(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)
gibt'6:04:31.208333'
die ziemlich in Ordnung ist zu lesen.Antworten:
Sie können das Zeitdelta einfach mit str () in einen String konvertieren. Hier ist ein Beispiel:
quelle
print 'some thing ' + str(delta)
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
so verwenden, verwenden Sie einfach split, um die Mikrosekunden außer Spiel zu setzen. Von 0: 03: 43.765000 kann ich 0:03:43 erhalten, indem ich einfachTotalDuration=str(ConvertDuration).split('.', 2)[0]
Wie Sie wissen, können Sie die total_seconds von einem timedelta-Objekt abrufen, indem Sie auf das
.seconds
Attribut zugreifen .Python bietet die integrierte Funktion,
divmod()
die Folgendes ermöglicht:oder Sie können in Stunden und Rest umrechnen, indem Sie eine Kombination aus Modulo und Subtraktion verwenden:
quelle
abs(s)
.'%d:%02d:%02d'
führende Nullen in der Ausgabezeichenfolge verwenden möchten ..seconds
wenn der Unterschied negativ oder länger als 24 Stunden sein kann (.seconds
Attribut ignoriert.days
). Verwenden Sie.total_seconds()
stattdessen oder sein Analog.Wenn Sie das
timedelta
Objekt an diestr()
Funktion übergeben, wird derselbe Formatierungscode aufgerufen, der bei einfacher Eingabe verwendet wirdprint td
. Da Sie die Sekunden nicht möchten, können wir die Zeichenfolge durch Doppelpunkte (3 Teile) teilen und sie nur mit den ersten 2 Teilen wieder zusammensetzen.quelle
str(my_timedelta)
funktioniert schlecht für negative Zahlenquelle
if seconds > period_seconds:
zuif seconds >= period_seconds:
jedoch.Ich persönlich benutze die
humanize
Bibliothek dafür:Natürlich gibt es Ihnen nicht genau die Antwort, nach der Sie gesucht haben (was in der Tat der Fall ist,
str(timeA - timeB)
aber ich habe festgestellt, dass das Display nach mehr als ein paar Stunden schnell unlesbar wird.humanize
Es unterstützt viel größere Werte für Menschen lesbar und auch gut lokalisiert.Es ist
contrib.humanize
anscheinend von Djangos Modul inspiriert. Da Sie also Django verwenden, sollten Sie es wahrscheinlich verwenden.quelle
naturaltime
ist das , was du nutzen willst.Er hat bereits ein timedelta-Objekt. Warum also nicht die integrierte Methode total_seconds () verwenden, um es in Sekunden zu konvertieren, und dann divmod () verwenden, um Stunden und Minuten abzurufen?
Dies funktioniert unabhängig davon, ob das Zeitdelta gerade Tage oder Jahre hat.
quelle
Hier ist eine Allzweckfunktion zum Konvertieren eines
timedelta
Objekts oder einer regulären Zahl (in Form von Sekunden oder Minuten usw.) in eine schön formatierte Zeichenfolge. Ich habe die fantastische Antwort von mpounsett auf eine doppelte Frage genommen, sie etwas flexibler gestaltet, die Lesbarkeit verbessert und die Dokumentation hinzugefügt.Sie werden feststellen, dass dies hier die bisher flexibelste Antwort ist, da Sie damit Folgendes tun können:
Funktion:
Demo:
quelle
Ich weiß, dass dies eine alte beantwortete Frage ist, aber ich benutze sie
datetime.utcfromtimestamp()
dafür. Es dauert die Anzahl der Sekunden und gibt eine zurückdatetime
, die wie jede andere formatiert werden kanndatetime
.Solange Sie für die Zeitabschnitte, die funktionieren sollten, im gesetzlichen Bereich bleiben, dh 1234: 35 nicht zurückgeben, da die Stunden <= 23 sind.
quelle
print timedelta(seconds=end - begin)
stattdessen verwenden..zfill(8)
Sie, wenn Sie es brauchen.Der Fragesteller möchte ein schöneres Format als das typische:
Es gibt also zwei Formate, eines, bei dem Tage 0 sind und weggelassen werden, und eines, bei dem der Text "n Tage, h: m: s" angezeigt wird. Die Sekunden können jedoch Brüche enthalten, und die Ausdrucke enthalten keine führenden Nullen, sodass die Spalten unübersichtlich sind.
Hier ist meine Routine, wenn es Ihnen gefällt:
Dies gibt die Ausgabe im Format dd: hh: mm: ss zurück:
Ich habe darüber nachgedacht, Jahre hinzuzufügen, aber dies bleibt als Übung für den Leser, da die Ausgabe bei über 1 Jahr sicher ist:
quelle
Ich würde hier ernsthaft über den Occam's Razor-Ansatz nachdenken:
Dies gibt eine Zeichenfolge ohne Mikrosekunden zurück
Wenn Sie das Objekt datetime.timedelta neu generieren möchten, gehen Sie wie folgt vor:
2 Jahre später liebe ich diese Sprache!
quelle
Meine
datetime.timedelta
Objekte waren länger als ein Tag. Hier ist also ein weiteres Problem. Alle obigen Diskussionen gehen von weniger als einem Tag aus. Atimedelta
ist eigentlich ein Tupel von Tagen, Sekunden und Mikrosekunden. Die obige Diskussion solltetd.seconds
wie Joe verwendet werden, aber wenn Sie Tage haben, ist sie NICHT im Sekundenwert enthalten.Ich erhalte eine Zeitspanne zwischen 2 Datumsangaben und Drucktagen und -stunden.
quelle
Ich habe die
humanfriendly
Python-Bibliothek verwendet, um dies zu tun, es funktioniert sehr gut.Verfügbar unter https://pypi.org/project/humanfriendly/
quelle
In Anlehnung an Joes obigen Beispielwert würde ich den Modularithmetikoperator verwenden, also:
Beachten Sie, dass die Ganzzahldivision in Python standardmäßig abgerundet wird. Wenn Sie expliziter sein möchten, verwenden Sie je nach Bedarf math.floor () oder math.ceil ().
quelle
td.total_seconds()
anstatt.seconds
zu verwenden, damit es für Intervalle> 1 Tag funktioniert.quelle
timedelta
Objekt die Felder hatdays
,seconds
undmicroseconds
durch die Dokumentation.Ich hatte ein ähnliches Problem mit der Ausgabe der Überstundenberechnung bei der Arbeit. Der Wert sollte immer in HH: MM angezeigt werden, auch wenn er größer als ein Tag ist und der Wert negativ werden kann. Ich habe einige der gezeigten Lösungen kombiniert und vielleicht findet jemand anderes diese Lösung nützlich. Ich habe festgestellt, dass die meisten der gezeigten Lösungen mit der divmod-Methode nicht sofort funktionieren, wenn der Timedelta-Wert negativ ist:
Zeitdelta zu HH: MM String:
quelle
quelle
Ein einfacher Vorlagenfilter für dieses Problem. Die eingebaute Funktion int () rundet niemals auf. F-Strings (dh f '') erfordern Python 3.6.
quelle
Dies wird produzieren:
quelle
Bitte überprüfen Sie diese Funktion - sie konvertiert das Timedelta-Objekt in die Zeichenfolge 'HH: MM: SS'.
quelle
Einzeiler. Da timedeltas keine strftime von datetime anbieten, bringen Sie das timedelta wieder auf datetime und verwenden Sie stftime.
Dies kann nicht nur das vom OP angeforderte Format Stunden: Minuten erreichen, sondern Sie können jetzt die volle Formatierungsleistung der Zeit von datetime nutzen, falls sich Ihre Anforderungen in eine andere Darstellung ändern.
Dies löst auch den Ärger, dass Zeitdelas in Zeichenfolgen als H: MM: SS und nicht als HH: MM: SS formatiert werden, was mich zu diesem Problem und der von mir geteilten Lösung führt.
quelle
Wenn Sie bereits ein Timedelta-Objekt haben, konvertieren Sie dieses Objekt einfach in einen String. Entfernen Sie die letzten 3 Zeichen der Zeichenfolge und drucken Sie. Dadurch wird der Sekundenabschnitt abgeschnitten und der Rest im Format Stunden: Minuten gedruckt.
quelle
print t.split('.')[0]
Wenn Sie zufällig
IPython
in Ihren Paketen haben (sollten Sie), hat es (jedenfalls bis jetzt) einen sehr schönen Formatierer für die Dauer (in Float-Sekunden). Das wird an verschiedenen Orten verwendet, zum Beispiel von der%%time
Zellmagie. Ich mag das Format, das es für kurze Zeit erzeugt:quelle
So für:
kehrt zurück:
quelle
Vielen Dank an alle für Ihre Hilfe. Ich habe viele Ihrer Ideen aufgenommen und zusammengestellt. Lassen Sie mich wissen, was Sie denken.
Ich habe der Klasse zwei Methoden hinzugefügt:
In meinem Django habe ich dies verwendet (Summe ist das Objekt und es befindet sich in einem Wörterbuch):
quelle