510 Stimmen

Was ist die Standardmethode, um N Sekunden zu datetime.time in Python hinzuzufügen?

Angenommen, ein datetime.time-Wert in Python, gibt es einen Standardweg, um eine ganze Zahl von Sekunden hinzuzufügen, so dass 11:34:59 + 3 = 11:35:02, zum Beispiel?

Diese offensichtlichen Ideen funktionieren nicht:

>>> datetime.time(11, 34, 59) + 3
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'datetime.time'

Letztendlich habe ich Funktionen wie diese geschrieben:

def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)

Ich kann nicht umhin zu denken, dass mir eine einfachere Möglichkeit fehlt, dies zu tun.

Verwandte

1 Stimmen

0 Stimmen

@jfs Und? Immer noch keine Unterstützung für 2021.

9voto

rescdsk Punkte 8548

Wenn es sich lohnt, eine weitere Datei / Abhängigkeit zu Ihrem Projekt hinzuzufügen, habe ich gerade eine winzige Klasse geschrieben, die datetime.time um die Möglichkeit erweitert, mathematische Operationen durchzuführen. Wenn Sie Mitternacht überschreiten, wird es auf Null zurückgesetzt. Jetzt hat die Frage "Wie spät ist es in 24 Stunden" viele Sonderfälle, einschließlich Sommerzeit, Schaltsekunden, historische Änderungen der Zeitzone usw. Aber manchmal benötigen Sie wirklich den einfachen Fall, und dafür ist das gut.

Ihr Beispiel würde so aussehen:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime erbt von datetime.time, sodass auch alle diese Methoden verwendet werden können.

Es ist von PyPi als nptime ("nicht pedantische Zeit") verfügbar oder auf GitHub unter: https://github.com/tgs/nptime

5voto

Bart Van Loon Punkte 1175

Zur Vollständigkeit hier ist der Weg, dies mit arrow zu tun (bessere Daten und Zeiten für Python):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

0 Stimmen

Es scheint, dass dies nicht mehr nützlich ist aufgrund eines Namenskonflikts mit einer experimentellen Pandas-Erweiterung.

4voto

VengaVenga Punkte 378

In einer realen Umgebung ist es nie eine gute Idee, ausschließlich mit time zu arbeiten, verwenden Sie immer datetime, noch besser utc, um Konflikte wie Übernachtungen, Sommerzeit, unterschiedliche Zeitzonen zwischen Benutzer und Server usw. zu vermeiden.

Also würde ich diesen Ansatz empfehlen:

import datetime as dt

_now = dt.datetime.now()  # oder dt.datetime.now(dt.timezone.utc)
_in_5_sec = _now + dt.timedelta(seconds=5)

# erhalte '14:39:57':
_in_5_sec.strftime('%H:%M:%S')

1voto

Ziggity Punkte 1

Wenn Sie noch kein timedelta-Objekt haben, wäre eine weitere Möglichkeit, einfach ein neues Zeitobjekt zu initialisieren mit den Attributen des alten und Werte dort hinzuzufügen, wo nötig:

   new_time:time = time(
       hour=curr_time.hour + n_hours,
       minute=curr_time.minute + n_minutes,
       seconds=curr_time.second + n_seconds
    )

Zugegeben, dies funktioniert nur, wenn Sie einige Annahmen über Ihre Werte treffen, da ein Überlauf hier nicht behandelt wird. Aber ich dachte, es wäre gut, dies im Hinterkopf zu behalten, da es eine oder zwei Zeilen sparen kann

0 Stimmen

Was ist die : Notation auf der linken Seite?

2 Stimmen

Typ-Hinweise. Nicht obligatorisch, aber es hat Vorteile. Ich empfehle Ihnen, das Video von Arjan Codes zu diesem Thema anzusehen.

0voto

Nick Johnson Punkte 99799

Versuchen Sie, ein datetime.datetime zu einem datetime.timedelta hinzuzufügen. Wenn Sie nur den Zeitanteil möchten, können Sie die Methode time() auf dem resultierenden datetime.datetime-Objekt aufrufen, um ihn zu erhalten.

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