Une différence majeure non soulignée dans les autres réponses est la présence de noms singuliers et pluriels pour chaque primitif de décalage horaire. Alors que timedelta
n'offre que des noms pluriels (par ex. hours
, days
) pour indiquer la différence de temps relative, relativedelta
propose également des noms au singulier (par ex. hour
, day
) pour désigner les informations de temps absolu.
Cela ressort clairement de la définition des 2 classes :
Definition: datetime.timedelta([days[, seconds[, microseconds[,
milliseconds[, minutes[, hours[, weeks]]]]]]])
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)
Maintenant, que fait exactement la forme singulière ? La forme singulière crée un delta qui, lorsqu'il est additionné à un datetime
définit cette primitive de date/heure spécifique dans l'objet datetime
à celle mentionnée dans le relativedelta
. Voici un petit exemple :
>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1) #Simply add one hour
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am
datetime.datetime(2018, 11, 17, 1, 6, 31)
Cela peut conduire à relativedelta
est utilisé pour certaines applications intéressantes, qui peuvent être compliquées à mettre en œuvre à l'aide de timedelta
. L'arrondi est l'un de ceux qui viennent rapidement à l'esprit.
Une application intéressante : Arrondir rapidement
Je vais maintenant vous montrer comment relativedelta
est plus expressif lorsqu'il s'agit d'arrondir un datetime
l'objet à la minute, à l'heure, au jour près, etc.
Arrondir à l'heure la plus proche :
Remarquez qu'il est très simple d'arrondir les chiffres à l'aide de la fonction relativedelta
:
#Using `relativedelta`
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
#Using `timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)
D'autres arrondis plus compliqués sont facilement réalisables en utilisant relativedelta
. Cependant, notez que tous les arrondis qui peuvent être effectués par relativedelta
peut aussi être fait en utilisant datetime
fonctions et timedelta
mais d'une manière un peu plus alambiquée.