437 Stimmen

Zeitdelta in String formatieren

Ich habe Probleme bei der Formatierung einer datetime.timedelta Objekt.

Hier ist, was ich t Ich habe eine Liste von Objekten und eines der Mitglieder der Klasse des Objekts ist ein Timedelta-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 erreichen, aber ich habe Schwierigkeiten. Mein derzeitiger Ansatz besteht darin, der Klasse für meine Objekte Methoden hinzuzufügen, die Stunden und Minuten zurückgeben. Die Stunden erhalte ich, indem ich die timedelta.seconds durch 3600 teile und das Ergebnis runde. Ich habe Schwierigkeiten, die restlichen Sekunden zu ermitteln und in Minuten umzurechnen.

Übrigens, ich verwende Google AppEngine mit Django Templates für die Präsentation.

18voto

Dhiraj Gupta Punkte 8345

Ich habe die humanfriendly python-Bibliothek, um dies zu tun, es funktioniert sehr gut.

import humanfriendly
from datetime import timedelta
delta = timedelta(seconds = 321)
humanfriendly.format_timespan(delta)

'5 minutes and 21 seconds'

Verfügbar unter https://pypi.org/project/humanfriendly/

15voto

GooDeeJAY Punkte 1501

Ich habe eine Funktion:

def period(delta, pattern):
    d = {'d': delta.days}
    d['h'], rem = divmod(delta.seconds, 3600)
    d['m'], d['s'] = divmod(rem, 60)
    return pattern.format(**d)

Beispiele:

>>> td = timedelta(seconds=123456789)
>>> period(td, "{d} days {h}:{m}:{s}")
'1428 days 21:33:9'
>>> period(td, "{h} hours, {m} minutes and {s} seconds, {d} days")
'21 hours, 33 minutes and 9 seconds, 1428 days'

15voto

Kevin J. Rice Punkte 3202

Der Fragesteller möchte ein schöneres Format als das übliche:

  >>> import datetime
  >>> datetime.timedelta(seconds=41000)
  datetime.timedelta(0, 41000)
  >>> str(datetime.timedelta(seconds=41000))
  '11:23:20'
  >>> str(datetime.timedelta(seconds=4102.33))
  '1:08:22.330000'
  >>> str(datetime.timedelta(seconds=413302.33))
  '4 days, 18:48:22.330000'

Es gibt also eigentlich zwei Formate, eines, bei dem die Tage 0 sind und weggelassen werden, und ein anderes, bei dem der Text "n Tage, h:m:s" steht. Aber die Sekunden können Brüche haben, und es gibt keine führenden Nullen in den Ausdrucken, also sind die Spalten unübersichtlich.

Hier ist meine Routine, falls Sie sie mögen:

def printNiceTimeDelta(stime, etime):
    delay = datetime.timedelta(seconds=(etime - stime))
    if (delay.days > 0):
        out = str(delay).replace(" days, ", ":")
    else:
        out = "0:" + str(delay)
    outAr = out.split(':')
    outAr = ["%02d" % (int(float(x))) for x in outAr]
    out   = ":".join(outAr)
    return out

gibt die Ausgabe im Format tt:hh:mm:ss zurück:

00:00:00:15
00:00:00:19
02:01:31:40
02:01:32:22

Ich habe darüber nachgedacht, Jahre hinzuzufügen, aber das bleibt als Übung für den Leser, da die Ausgabe bei über 1 Jahr sicher ist:

>>> str(datetime.timedelta(seconds=99999999))
'1157 days, 9:46:39'

14voto

Mon datetime.timedelta Objekte gingen länger als einen Tag. Hier ist also ein weiteres Problem. In der obigen Diskussion wird von weniger als einem Tag ausgegangen. A timedelta ist eigentlich ein Tupel aus Tagen, Sekunden und Mikrosekunden. Die obige Diskussion sollte td.seconds wie Joe es getan hat, aber wenn Sie Tage haben, sind diese NICHT im Sekundenwert enthalten.

Ich erhalte eine Zeitspanne zwischen 2 Datumsangaben und drucke Tage und Stunden.

span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)

7voto

UltraNurd Punkte 1244

In Anlehnung an Joes obigen Beispielwert würde ich den arithmetischen Operator modulus folgendermaßen verwenden:

td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)

Beachten Sie, dass die Ganzzahldivision in Python standardmäßig abwärts rundet; wenn Sie es genauer wissen wollen, verwenden Sie math.floor() oder math.ceil().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X