I have a datetime object produced using
strptime ().
>>> tm
datetime.datetime(2010, 6, 10, 3, 56, 23)
Ce que je dois faire, c'est arrondir la minute à la 10e minute la plus proche. Ce que j'ai fait jusqu'à présent, c'est de prendre la valeur minute et d'utiliser round () dessus.
min = round(tm.minute, -1)
Cependant, comme dans l'exemple ci-dessus, il donne une heure invalide lorsque la valeur des minutes est supérieure à 56. c'est-à-dire: 3:60
Quelle est la meilleure façon de procéder? Supporte-t-il datetime
cela?
dt.replace(hour=0, minute=0, second=0)
place dedt.min
.roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60*24*7)
vsroundTime(datetime.datetime(2012,12,30,23,44,59,1234),roundTo=60*60*24*7)
datetime.timedelta(100,1,2,3).seconds == 1
De la meilleure réponse que j'ai modifiée à une version adaptée utilisant uniquement des objets datetime, cela évite d'avoir à faire la conversion en secondes et rend le code d'appel plus lisible:
Échantillons avec arrondi d'une heure et arrondi de 15 minutes:
la source
print roundTime(datetime.datetime(2012,12,20,23,44,49),datetime.timedelta(days=15))
2012-12-20 00:00:00
tandis queprint roundTime(datetime.datetime(2012,12,21,23,44,49),datetime.timedelta(days=15))
2012-12-21 00:00:00
J'ai utilisé le code Stijn Nevens (merci Stijn) et j'ai un petit add-on à partager. Arrondir vers le haut, vers le bas et arrondir au plus proche.
mise à jour 09/03/2019 = commentaire Spinxz incorporé; Merci.
mise à jour 2019-12-27 = commentaire Bart incorporé; Merci.
Testé pour date_delta de «X heures» ou «X minutes» ou «X secondes».
la source
up
arrondi est de toute façon inexact avec cette fonction;2019-11-07 14:39:00.776980
avecdate_delta
égale par exemple 30 sec etto='up'
donne2019-11-07 14:39:00
.up
arrondi ne soit pas un cas d'utilisation courant, il est nécessaire lorsque vous traitez avec des applications qui commencent à la limite des minutesPandas a une fonction de ronde datetime, mais comme pour la plupart des choses dans Pandas, il doit être au format Série.
Docs - Modifiez la chaîne de fréquence selon vos besoins.
la source
Timestamp
contientfloor
etceil
aussisi vous ne souhaitez pas utiliser de condition, vous pouvez utiliser l'
modulo
opérateur:METTRE À JOUR
vouliez-vous quelque chose comme ça?
.. si vous voulez un résultat sous forme de chaîne. pour obtenir le résultat datetime, il est préférable d'utiliser timedelta - voir les autres réponses;)
la source
j'utilise ça. il a l'avantage de travailler avec des datetimes sensibles à tz.
il a l'inconvénient de ne fonctionner que pour des tranches horaires de moins d'une heure.
la source
Voici une solution généralisée plus simple sans problèmes de précision en virgule flottante et dépendances de bibliothèques externes:
Dans ton cas:
la source
la source
Basé sur Stijn Nevens et modifié pour l'utilisation de Django pour arrondir l'heure actuelle aux 15 minutes les plus proches.
si vous avez besoin d'une date et d'une heure complètes, supprimez simplement le
.strftime('%H:%M:%S')
la source
Pas le meilleur pour la vitesse lorsque l'exception est interceptée, mais cela fonctionnerait.
Timings
la source
Une solution intuitive sur deux lignes pour arrondir à une unité de temps donnée, ici secondes, pour un
datetime
objett
:Si vous souhaitez arrondir à une autre unité, modifiez simplement
format_str
.Cette approche ne s'arrondit pas à des durées arbitraires comme les méthodes ci-dessus, mais est une manière bien pythonique d'arrondir à une heure, une minute ou une seconde donnée.
la source
Autre solution:
J'espère que cela t'aides!
la source
Le moyen le plus court que je connaisse
la source
Celles-ci semblent trop complexes
la source
Une approche simple:
la source
oui, si vos données appartiennent à une colonne DateTime d'une série pandas, vous pouvez les arrondir à l'aide de la fonction pandas.Series.dt.round intégrée. Voir la documentation ici sur pandas.Series.dt.round . Dans votre cas d'arrondi à 10min, ce sera Series.dt.round ('10min') ou Series.dt.round ('600s') comme ceci:
Modifier pour ajouter un exemple de code:
la source