Bitte, wie ein int (Anzahl a Sekunden) in diese Formate konvertieren: mm: ss oder hh: mm: ss?Python: konvertieren Sekunden hh: mm: ss
Ich muss dies mit Python-Code (und wenn möglich in einer Django-Vorlage?) Tun.
Vielen Dank ;-)
Bitte, wie ein int (Anzahl a Sekunden) in diese Formate konvertieren: mm: ss oder hh: mm: ss?Python: konvertieren Sekunden hh: mm: ss
Ich muss dies mit Python-Code (und wenn möglich in einer Django-Vorlage?) Tun.
Vielen Dank ;-)
Ich kann nicht glauben, dass eine der vielen Antworten das gibt, was ich als den "offensichtlichen Weg" betrachte (und ich bin nicht mal Holländer ...! -) - bis knapp unter 24 Stunden im wert von Sekunden (86.399 Sekunden, speziell):
>>> import time
>>> time.strftime('%H:%M:%S', time.gmtime(12345))
'03:25:45'
es in einer wählerischen ist Django-Vorlage tun, da die time
Filter unterstützen eine flippige Zeit-Formatierung Syntax (inspiriert, glaube ich, von PHP), und benötigt außerdem das datetime-Modul und eine Zeitzonenimplementierung wie pytz, um die Daten vorzubereiten.Beispiel:
>>> from django import template as tt
>>> import pytz
>>> import datetime
>>> tt.Template('{{ x|time:"H:i:s" }}').render(
... tt.Context({'x': datetime.datetime.fromtimestamp(12345, pytz.utc)}))
u'03:25:45'
Abhängig von Ihren genauen Anforderungen ist es möglicherweise einfacher, einen benutzerdefinierten Filter für diese Formatierungsaufgabe in Ihrer App zu definieren.
Haben Sie auf dem datetime Modul nachlesen?
Bearbeiten/aktualisieren: Die Antwort von SilentGhost hat die Details, die meine Antwort auslässt. Wenn Sie diese Antwort mögen, +1 auch sein (oder stattdessen). Reposted hier:
>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
@sth: SilentGhost die deets hat. –
Ich glaube nicht, dass irgendetwas in datetime tut, was er will. Es gibt nichts wie timedelta.strftime, und selbst wenn er seine "Anzahl an Sekunden" als Timedelta speichert (was er wahrscheinlich tun sollte), müsste er die Formatierung selbst vornehmen. Es in eine Zeit umzuwandeln würde ein Hack sein, da er scheinbar eine gewisse Zeit (Timedelta) hat und nicht eine Tageszeit (Zeit). –
@Glenn: Was stimmt nicht mit der Darstellung von str()? –
Neben der Tatsache, dass Python hat für Daten und Zeiten zur Unterstützung gebaut, finden Minuten oder Stunden von Sekunden (bigmattyh Antwort sehen) ist einfach:
minutes = seconds/60
hours = minutes/60
Nun, wenn Sie wollen sie Minuten oder Sekunden, MOD um 60 angezeigt werden, so dass sie nicht größer als 59
Minuten ist modulo 60, so ist es immer <60, also Stunden == 0 ... –
Hoppla, sorry, soll diesen Schritt nachher tun ... wird behoben –
kein python Person zu sein, aber am einfachsten ohne Bibliotheken nur:
total = 3800
seconds = total % 60
total = total - seconds
hours = total/3600
total = total - (hours * 3600)
mins = total/60
Aktualisiert Code dank etw
Sie können die Anzahl von Minuten und Stunden von der Anzahl der Sekunden durch einfache Division berechnen:
seconds = 12345
minutes = seconds // 60
hours = minutes // 60
print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60)
print "%02d:%02d" % (minutes, seconds % 60)
Hier //
ist Pythons Integer-Division.
Serious, benutze divmod. –
Seien Sie vorsichtig, wenn Sie durch 60 dividieren: Division zwischen Ganzzahlen gibt eine Ganzzahl zurück -> 12/60 = 0, es sei denn, Sie importieren Division von Zukunft. Hier finden Sie Kopieren und Einfügen von Python 2.6.2:
IDLE 2.6.2
>>> 12/60
0
>>> from __future__ import division
>>> 12/60
0.20000000000000001
>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
h: mm: sss ist nicht hh: mm: ss. –
ernst? und es lohnt sich downvote? – SilentGhost
@Glenn: Es ist ziemlich gut ... und wenn das OP es weiter formatieren will, ist es nicht gerade Raketenwissenschaft von hier. –
Code, was mit Beispielen angefordert, tut wurde, und das zeigt, wie Fälle, die er nicht behandelt werden haben angeben:
def format_seconds_to_hhmmss(seconds):
hours = seconds // (60*60)
seconds %= (60*60)
minutes = seconds // 60
seconds %= 60
return "%02i:%02i:%02i" % (hours, minutes, seconds)
def format_seconds_to_mmss(seconds):
minutes = seconds // 60
seconds %= 60
return "%02i:%02i" % (minutes, seconds)
minutes = 60
hours = 60*60
assert format_seconds_to_mmss(7*minutes + 30) == "07:30"
assert format_seconds_to_mmss(15*minutes + 30) == "15:30"
assert format_seconds_to_mmss(1000*minutes + 30) == "1000:30"
assert format_seconds_to_hhmmss(2*hours + 15*minutes + 30) == "02:15:30"
assert format_seconds_to_hhmmss(11*hours + 15*minutes + 30) == "11:15:30"
assert format_seconds_to_hhmmss(99*hours + 15*minutes + 30) == "99:15:30"
assert format_seconds_to_hhmmss(500*hours + 15*minutes + 30) == "500:15:30"
Sie können dies - und sollten es wahrscheinlich auch - als Timedelta anstatt als Int speichern, aber das ist ein separates Problem, und Timedelta vereinfacht diese Aufgabe nicht.
Wählen Sie eine saubere, klare Lösung, die genau das gibt, was angefordert wurde, komplett mit Tests - ein leuchtendes Beispiel für das Wahlsystem von StackOverflow. Wer kümmert sich darum? –
+1: Nette, gründliche und flexible Antwort; und teilweise dem Downvote entgegenzuwirken. (Obwohl ich nicht beabsichtige, die Debatte über Datetime und das hier einzuschätzen, gehe ich davon aus, dass das OP bald darauf sagen wird, worauf er hoffte.) – tom10
Eine etwas hitzigere Debatte, als ich selbst für so etwas suchte Grundfrage; es gibt bessere Dinge, um Energie auszugeben ... –
Wenn Sie divmod verwenden, Sie sind immun gegen verschiedene Varianten von Integer-Division:
# show time strings for 3800 seconds
# easy way to get mm:ss
print "%02d:%02d" % divmod(3800, 60)
# easy way to get hh:mm:ss
print "%02d:%02d:%02d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(3800,),60,60])
# function to convert floating point number of seconds to
# hh:mm:ss.sss
def secondsToStr(t):
return "%02d:%02d:%02d.%03d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(t*1000,),1000,60,60])
print secondsToStr(3800.123)
Drucke:
63:20
01:03:20
01:03:20.123
Wenn Sie diese viel tun, dann können Sie alle möglichen Strings vorauszuberechnen für die Anzahl der Sekunden an einem Tag:
try:
from itertools import product
except ImportError:
def product(*seqs):
if len(seqs) == 2:
for s1 in seqs[0]:
for s2 in seqs[1]:
yield (s1,s2)
else:
for s in seqs[0]:
for p in product(*seqs[1:]):
yield (s,) + p
hhmmss = {}
i = 0
for (h,m,s) in product(range(24),range(60),range(60)):
hhmmss[i] = "%02d:%02d:%02d" % (h,m,s)
i += 1
Jetzt Umwandlung von Sekunden zum Format strin g ist ein schneller dict-Lookup:
print hhmmss[12345]
druckt
'03:25:45'
während es ein kleines Problem ist, das möglicherweise irrelevant für das OP 'time.straftime ('% H:% M:% S', time.gmtime (864001)) 'eine böse Überraschung zurückgeben. – SilentGhost
Yep, funktioniert nur für einen Tag - wie auch Ihre Lösung natürlich, die anders als "Umbrechen" bricht, da 'str (datetime.timedelta (Sekunden = 86400))' sagt "1 Tag"; -) –
:) Ich glaube nicht, dass meine Lösung * zusammenbricht *, es bietet immer noch die lesbarste Ausgabe, da OP nicht an der Diskussion hier teilgenommen hat, kann ich frei davon ausgehen, dass das genau das ist, was er will . – SilentGhost