J'ai du mal à formater un datetime.timedelta
objet.
Voici ce que j'essaie de faire: j'ai une liste d'objets et l'un des membres de la classe de l'objet est un objet timedelta qui montre la durée d'un événement. Je voudrais afficher cette durée au format heures: minutes.
J'ai essayé une variété de méthodes pour ce faire et j'ai des difficultés. Mon approche actuelle consiste à ajouter des méthodes à la classe pour mes objets qui renvoient des heures et des minutes. Je peux obtenir les heures en divisant le timedelta.seconds par 3600 et en l'arrondissant. J'ai du mal à obtenir les secondes restantes et à les convertir en minutes.
Soit dit en passant, j'utilise Google AppEngine avec les modèles Django pour la présentation.
datetime.utcfromtimestamp()
. Voir ma réponse ci-dessous.__str__
detimedelta
est tout à fait décent, contrairement à__repr__
(c'est-à-dire - pour les humains!). Par exemple:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48
donnedatetime.timedelta(seconds=21871, microseconds=208333)
, maisstr(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)
donne'6:04:31.208333'
ce qui est assez correct à lire.Réponses:
Vous pouvez simplement convertir le timedelta en une chaîne avec str (). Voici un exemple:
la source
print 'some thing ' + str(delta)
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
vous utilisez simplement le fractionnement pour retirer les microsecondes du jeu. De 0: 03: 43.765000 je peux obtenir 0:03:43 en exécutant simplementTotalDuration=str(ConvertDuration).split('.', 2)[0]
Comme vous le savez, vous pouvez obtenir le total_seconds d'un objet timedelta en accédant à l'
.seconds
attribut.Python fournit la fonction intégrée
divmod()
qui permet:ou vous pouvez convertir en heures et en reste en utilisant une combinaison de modulo et de soustraction:
la source
abs(s)
.'%d:%02d:%02d'
des zéros non significatifs dans la chaîne de sortie..seconds
si la différence peut être négative ou supérieure à 24 heures (l'.seconds
attribut ignore.days
). Utilisez.total_seconds()
ou son analogue à la place.Passer l'
timedelta
objet à lastr()
fonction appelle le même code de mise en forme utilisé si nous tapons simplementprint td
. Puisque vous ne voulez pas des secondes, nous pouvons diviser la chaîne par deux points (3 parties) et la remettre ensemble avec seulement les 2 premières parties.la source
str(my_timedelta)
fonctionne mal pour les nombres négatifsla source
if seconds > period_seconds:
de changerif seconds >= period_seconds:
.J'utilise personnellement la
humanize
bibliothèque pour cela:Bien sûr, cela ne vous donne pas exactement la réponse que vous cherchiez (ce qui est vrai,
str(timeA - timeB)
mais j'ai constaté qu'une fois que vous avez dépassé quelques heures, l'affichage devient rapidement illisible. Prend enhumanize
charge des valeurs beaucoup plus grandes qui sont lisible par l'homme, et est également bien localisé.Il est
contrib.humanize
apparemment inspiré du module de Django , donc puisque vous utilisez Django, vous devriez probablement l'utiliser.la source
naturaltime
c'est ce que vous voulez utiliser.Il a déjà un objet timedelta, alors pourquoi ne pas utiliser sa méthode intégrée total_seconds () pour le convertir en secondes, puis utiliser divmod () pour obtenir les heures et les minutes?
Cela fonctionne peu importe si le delta de temps a même des jours ou des années.
la source
Voici une fonction à usage général pour convertir un
timedelta
objet ou un nombre régulier (sous forme de secondes ou de minutes, etc.) en une chaîne bien formatée. J'ai pris la réponse fantastique de mpounsett sur une question en double, je l'ai rendue un peu plus flexible, amélioré la lisibilité et ajouté de la documentation.Vous constaterez que c'est la réponse la plus flexible jusqu'ici car elle vous permet de:
Fonction:
Démo:
la source
Je sais que c'est une vieille question à réponse, mais je l'utilise
datetime.utcfromtimestamp()
pour cela. Cela prend le nombre de secondes et retourne undatetime
qui peut être formaté comme n'importe quel autredatetime
.Tant que vous restez dans les plages légales pour les parties de temps, cela devrait fonctionner, c'est-à-dire qu'il ne renvoie pas 1234: 35 car les heures sont <= 23.
la source
print timedelta(seconds=end - begin)
place..zfill(8)
si vous en avez besoin.Questioner veut un format plus agréable que le standard:
Donc, il y a vraiment deux formats, l'un où les jours sont 0 et il est omis, et l'autre où il y a du texte "n jours, h: m: s". Mais, les secondes peuvent avoir des fractions, et il n'y a pas de zéros de tête dans les impressions, donc les colonnes sont en désordre.
Voici ma routine, si vous l'aimez:
cela renvoie la sortie au format dd: hh: mm: ss:
J'ai pensé à ajouter des années à cela, mais cela reste un exercice pour le lecteur, car la sortie est sûre à plus d'un an:
la source
Je considérerais sérieusement l'approche du rasoir d'Occam ici:
Cela renvoie une chaîne sans les microsecondes
Si vous souhaitez régénérer l'objet datetime.timedelta, procédez comme suit:
Depuis 2 ans, j'adore cette langue!
la source
Mes
datetime.timedelta
objets ont dépassé la journée. Voici donc un autre problème. Toute la discussion ci-dessus suppose moins d'une journée. Atimedelta
est en fait un tuple de jours, de secondes et de microsecondes. La discussion ci-dessus devrait être utiliséetd.seconds
comme Joe l'a fait, mais si vous avez des jours, elle n'est PAS incluse dans la valeur des secondes.Je reçois un intervalle de temps entre 2 heures et jours et heures d'impression.
la source
J'ai utilisé la
humanfriendly
bibliothèque python pour cela, cela fonctionne très bien.Disponible sur https://pypi.org/project/humanfriendly/
la source
En suivant l'exemple de la valeur de Joe ci-dessus, j'utiliserais l'opérateur arithmétique du module, donc:
Notez que la division entière en Python arrondit par défaut; si vous voulez être plus explicite, utilisez math.floor () ou math.ceil () selon le cas.
la source
td.total_seconds()
au lieu de.seconds
le faire fonctionner pour des intervalles> 1 jour.la source
timedelta
objet a les champsdays
,seconds
etmicroseconds
par la documentation.J'ai eu un problème similaire avec la sortie du calcul des heures supplémentaires au travail. La valeur doit toujours apparaître en HH: MM, même lorsqu'elle est supérieure à un jour et que la valeur peut devenir négative. J'ai combiné certaines des solutions présentées et peut-être que quelqu'un d'autre a trouvé cette solution utile. J'ai réalisé que si la valeur timedelta est négative, la plupart des solutions affichées avec la méthode divmod ne fonctionnent pas immédiatement:
timedelta à HH: MM chaîne:
la source
la source
Un filtre de modèle simple pour ce problème. La fonction intégrée int () n'est jamais arrondie. Les chaînes F (c'est-à-dire f '') nécessitent python 3.6.
la source
Cela produira:
la source
Veuillez vérifier cette fonction - il convertit l'objet timedelta en chaîne 'HH: MM: SS'
la source
Bon mot. Puisque les timedeltas n'offrent pas le strftime de datetime, ramenez le timedelta à un datetime et utilisez stftime.
Cela peut non seulement atteindre le format demandé par l'OP Heures: minutes, vous pouvez maintenant tirer parti de toute la puissance de formatage du strftime de datetime, si vos besoins changent en une autre représentation.
Cela résout également la gêne que les timedeltas sont formatés en chaînes comme H: MM: SS plutôt que HH: MM: SS, ce qui m'amène à ce problème et à la solution que j'ai partagée.
la source
Si vous avez déjà un obj timedelta, convertissez-le simplement en chaîne. Supprimez les 3 derniers caractères de la chaîne et imprimez. Cela tronquera la partie des secondes et imprimera le reste au format Heures: Minutes.
la source
print t.split('.')[0]
S'il vous arrive d'avoir
IPython
dans vos paquets (vous devriez), il a (jusqu'à présent, de toute façon) un très bon formateur pour les durées (en secondes flottantes). Cela est utilisé à divers endroits, par exemple par la%%time
magie cellulaire. J'aime le format qu'il produit pour de courtes durées:la source
Donc pour:
Retour:
la source
Merci à tous pour votre aide. J'ai pris bon nombre de vos idées et les ai rassemblées, faites-moi savoir ce que vous en pensez.
J'ai ajouté deux méthodes à la classe comme ceci:
Dans mon django, j'ai utilisé ceci (la somme est l'objet et elle est dans un dictionnaire):
la source