119 votes

Quelle est la différence entre "datetime.timedelta" et "dateutil.relativedelta.relativedelta" lorsqu'on travaille uniquement avec des jours ?

Quelle est la différence entre datetime.timedelta (de la bibliothèque standard de Python) et dateutil.relativedelta.relativedelta lorsque vous travaillez uniquement avec des jours ?

D'après ce que j'ai compris, timedelta ne prend en charge que les jours (et les semaines), tandis que relativedelta ajoute la prise en charge de périodes définies en termes d'années, de mois, de semaines ou de jours, ainsi que la définition de valeurs absolues pour l'année, le mois ou le jour. (rappelez-vous, pour les besoins de cette question, je ne dois pas me soucier des heures, des minutes ou des secondes)

Considérant que je ne travaille qu'avec datetime.date et qui ne s'intéressent qu'aux périodes définies par le nombre de jours, quelle est la différence entre timedelta y relativedelta ? Y a-t-il une différence ?

from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

i = -1  # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)

98voto

Hans Then Points 5570

dateutil est un paquet d'extension au standard python datetime module. Comme vous le dites, il fournit des fonctionnalités supplémentaires, telles que les timedeltas qui sont exprimées en unités plus grandes qu'un jour.

C'est utile si vous devez poser des questions telles que : combien de mois puis-je économiser avant l'anniversaire de ma petite amie, ou quel est le dernier vendredi du mois ? Cela permet de masquer les calculs complexes dus aux différentes longueurs des mois ou aux jours supplémentaires des années bissextiles.

Dans votre cas, vous n'êtes intéressé que par le nombre de jours. Il est donc préférable d'utiliser timedelta car cela permet d'éviter une dépendance supplémentaire à l'égard du module dateutil paquet.

46voto

unutbu Points 222216

A relativedelta a beaucoup plus de paramètres qu'un timedelta :

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)

avec lequel vous pouvez faire des choses comme calculer le dernier vendredi d'un mois :

In [14]: import datetime as dt

In [15]: import dateutil.relativedelta as relativedelta

In [16]: today = dt.date.today()

In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1))

In [18]: today+rd
Out[18]: datetime.date(2012, 9, 28)

22voto

shivams Points 56

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X