Quelle est la différence entre datetime.timedelta
(à partir de la bibliothèque standard de Python) et dateutil.relativedelta.relativedelta
lorsque vous travaillez uniquement avec des jours?
Pour autant que je sache, timedelta
ne prend en charge que les jours (et les semaines), tout en relativedelta
ajoutant un support pour des 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 n'ai pas à me soucier des heures, des minutes ou des secondes)
Étant donné que je ne travaille qu'avec des datetime.date
objets et que je ne m'intéresse qu'aux périodes définies par le nombre de jours, quelle est la différence entre timedelta
et 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)
dateime.timedelta
qui permettra d'obtenir ce que vous voulez et d'éviter la dépendance audateutil
paquet externe .Réponses:
dateutil
est un package d'extension dudatetime
module standard python . Comme vous le dites, il fournit des fonctionnalités supplémentaires, telles que les timedeltas qui sont exprimées en unités supérieures à un jour.Ceci 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 masque les calculs complexes causés par les différentes longueurs des mois ou les jours supplémentaires dans les années bissextiles.
Dans votre cas, vous n'êtes intéressé que par le nombre de jours. Il vaut donc mieux l'utiliser
timedelta
car cela évite une dépendance supplémentaire sur ledateutil
package.la source
A
relativedelta
a beaucoup plus de paramètres qu'untimedelta
: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)
la source
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
timedelta
que n'offre que des noms au pluriel (par exemplehours
,days
) pour désigner une différence de temps relative,relativedelta
offre également des noms au singulier (par exemplehour
,day
) pour désigner des informations de temps absolues.Cela ressort clairement de la définition des 2 classes:
Maintenant, que fait exactement la forme singulière? La forme singulière crée un delta qui, lorsqu'il est ajouté à un
datetime
objet, définit cette primitive de date / heure spécifique dans l'datetime
objet sur celle mentionnée dans lerelativedelta
. 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
être utilisé pour certaines applications intéressantes, qui peuvent être compliquées à mettre en œuvretimedelta
. Une solution qui me vient rapidement à l'esprit est l'arrondissement.Une application intéressante: arrondir rapidement
Je vais maintenant vous montrer comment il
relativedelta
est plus expressif d'arrondir undatetime
objet à la minute, à l'heure, au jour, etc.Arrondir à l'heure la plus proche:
Remarquez à quel point il est simple d'arrondir en utilisant
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 parrelativedelta
peuvent également être effectués à l'aide dedatetime
fonctions ettimedelta
, seulement de manière légèrement plus alambiquée.la source