Une différence majeure non soulignée dans les autres réponses est la présence de noms singuliers et pluriels pour chaque primitive de différence de temps. Bien timedeltaque n'offre que des noms au pluriel (par exemple hours, days) pour désigner une différence de temps relative, relativedeltaoffre également des noms au singulier (par exemple hour, day) pour désigner des informations de temps absolues.
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 ajouté à un datetimeobjet, définit cette primitive de date / heure spécifique dans l' datetimeobjet sur 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)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
Cela peut conduire à relativedeltaêtre utilisé pour certaines applications intéressantes, qui peuvent être compliquées à mettre en œuvre timedelta. Une solution qui me vient rapidement à l'esprit est l'arrondissement.
Une application intéressante: arrondir rapidement
Je vais maintenant vous montrer comment il relativedeltaest plus expressif d'arrondir un datetimeobjet à la minute, à l'heure, au jour, etc.
Arrondir à l'heure la plus proche:
Remarquez à quel point il est simple d'arrondir en utilisant relativedelta:
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
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 relativedeltapeuvent également être effectués à l'aide de datetimefonctions et timedelta, seulement de manière légèrement plus alambiquée.
dateime.timedeltaqui permettra d'obtenir ce que vous voulez et d'éviter la dépendance audateutilpaquet externe .