Quelle est la méthode standard pour ajouter N secondes à datetime?de temps en Python?

étant donné une valeur datetime.time en Python, y a-t-il une façon standard d'ajouter un nombre entier de secondes, de sorte que 11:34:59 + 3 = 11:35:02 , par exemple?

ces idées évidentes ne fonctionnent pas:

>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

à la fin j'ai écrit des fonctions comme ceci:

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)

Je ne peux pas m'empêcher de penser que je manque une façon plus facile de le faire cependant.

lié

  • python temps + timedelta équivalent
274
demandé sur Community 2008-09-19 11:19:36

8 réponses

vous pouvez utiliser la totalité des variables datetime avec timedelta , et en fournissant une date fictive puis en utilisant time pour obtenir juste la valeur temporelle.

par exemple:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

donne les deux valeurs, espacées de trois secondes:

11:34:59
11:35:02

vous pouvez également opter pour le plus lisible

b = a + datetime.timedelta(seconds=3)

si vous êtes si incliné.


Si vous êtes après une fonction qui peut faire cela, vous pouvez regarder en utilisant addSecs ci-dessous:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

Ce sorties:

 09:11:55.775695
 09:16:55
386
répondu paxdiablo 2013-01-15 01:19:11

comme d'autres l'ont déclaré ici, vous pouvez simplement utiliser les objets datetime tout au long:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

cependant, je pense qu'il est intéressant d'expliquer pourquoi des objets datetime complets sont nécessaires. Pensez à ce qui se passerait si j'ajoutais 2 heures à 23 heures. Quel est le comportement correct? Une exception, parce que vous ne pouvez pas avoir un temps plus grand que 23h59? Faut-il de retour envelopper autour?

programmeurs différents attendront des choses différentes, donc quel que soit le résultat ils repris il serait surpris beaucoup de gens. Pire encore, les programmeurs écrivaient du code qui fonctionnait très bien quand ils le testaient initialement, et le faisaient casser plus tard en faisant quelque chose d'inattendu. C'est très mauvais, c'est pourquoi vous n'êtes pas autorisé à ajouter timedelta objets à la fois des objets.

43
répondu Eli Courtwright 2008-09-19 13:47:29

une petite chose, pourrait ajouter de la clarté pour outrepasser la valeur par défaut pendant les secondes

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
16
répondu unmounted 2008-09-19 08:08:10

merci à @Pax Diablo, @bvmou et @Arachnid pour la suggestion d'utiliser des temps de données complets tout au long. Si je dois accepter datetime.objets de temps d'une source externe, alors cela semble être une alternative add_secs_to_time() fonction:

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

ce code verbeux peut être compressé sur cette doublure:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

mais je pense que je voudrais envelopper cela dans une fonction pour la clarté du code de toute façon.

9
répondu Paul Stephenson 2008-09-19 09:40:06

si cela vaut la peine d'ajouter un autre fichier / dépendance à votre projet, je viens d'écrire une toute petite classe qui s'étend datetime.time avec la capacité de faire de l'arithmétique. Quand tu passes minuit, ça tourne autour de zéro. Maintenant, "quelle heure sera - t-il, dans 24 heures" a beaucoup de cas de coin, y compris l'heure avancée, les secondes bissextiles, les changements de fuseau horaire historique, et ainsi de suite. Mais parfois, vous avez vraiment besoin de la simple affaire, et c'est ce que cela va faire.

Votre exemple s'écrirait:

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

nptime hérite de datetime.time , donc n'importe laquelle de ces méthodes devrait être utilisable, aussi.

disponible auprès de PyPi en tant que nptime ("non-pedantic time"), ou sur GitHub: https://github.com/tgs/nptime

6
répondu rescdsk 2012-04-04 19:31:30

vous ne pouvez pas simplement ajouter le numéro à datetime parce qu'il n'est pas clair quelle unité est utilisée: Secondes, Heures, semaines...

il y a timedelta classe pour les manipulations avec la date et l'heure. datetime moins datetime donne timedelta , datetime plus timedelta donne datetime , deux datetime les objets ne peuvent pas être ajoutés bien que deux timedelta le pouvez.

créer timedelta objet avec combien de secondes vous voulez ajouter et ajouter à datetime objet:

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

il y a le même concept en C++: std::chrono::duration .

4
répondu user2387567 2018-01-18 12:49:26

Essayez d'ajouter un datetime.datetime à un datetime.timedelta . Si vous voulez seulement la portion de temps, vous pouvez appeler la méthode time() sur l'objet résultant datetime.datetime pour l'obtenir.

1
répondu Nick Johnson 2017-03-15 14:53:17

pour le bien de l'achèvement, voici la façon de le faire avec arrow (meilleures dates et heures pour Python):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)
1
répondu Bart Van Loon 2017-10-09 19:41:17