Existe-t-il un moyen simple de dire que

a = '2020-01-01 19:30:33.996628' 
b = '2020-01-01 19:30:34' 

a et b sont égaux. Si la résolution temporelle de a est modifiée en seconde, alors a pourrait être égal à b. Comment l'implémenter avec du code?

3
ComplicatedPhenomenon 9 mai 2020 à 10:32

3 réponses

Meilleure réponse

Si vous les traitez tous les deux comme des objets datetime, vous pouvez utiliser des opérateurs arithmétiques sur eux. Par exemple, vous pouvez les soustraire et vérifier si le résultat satisfait à une condition (comme moins d'une minute différente) comme vous le souhaitez

2
Roim 9 mai 2020 à 07:48
  • Utilisez .replace(microsecond=0)
from datetime import datetime

a = datetime.fromisoformat('2020-01-01 19:30:33.996628')

print(a)

>>> datetime.datetime(2020, 1, 1, 19, 30, 33, 996628)

a = a.replace(microsecond=0)

print(a)

>>> datetime.datetime(2020, 1, 1, 19, 30, 33)

Arrondir

  • Ajoutez la timedelta différence entre 1ms et a.microsecond
from datetime import timedelta

a = datetime.fromisoformat('2020-01-01 19:30:33.996628')

a = a + timedelta(microseconds=(1e6 - a.microsecond))

print(a)

>>> datetime.datetime(2020, 1, 1, 19, 30, 34)

print(a.strftime('%Y-%m-%d %H:%M:%S'))

>>> 2020-01-01 19:30:34
2
Trenton McKinney 9 mai 2020 à 08:16

Un moyen plus simple d'utiliser l'arrondi à des fins de comparaison: -

import datetime
from dateutil import parser

a = '2020-01-01 19:30:33.996628' 
b = '2020-01-01 19:30:34' 

a = parser.parse(a)
b = parser.parse(b)

a == b
False

format_str = '%Y-%m-%d %H:%M'

a_rounded = datetime.datetime.strptime(datetime.datetime.strftime(a, format_str), format_str)
b_rounded = datetime.datetime.strptime(datetime.datetime.strftime(b, format_str), format_str)

a_rounded == b_rounded
True

À cela, vous pouvez ajouter de la flexibilité en fonction de vos besoins, comme je l'ai arrondi à la comparaison dans Minutes. Donc, dans votre cas, le format_str serait comme ceci: -

format_str = '%Y-%m-%d %H:%M:%S'
0
Shashishekhar Hasabnis 9 mai 2020 à 08:23