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
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
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.
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)
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.
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
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
.
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.
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)