python - example - ¿Cuál es la diferencia entre "datetime.timedelta" y "dateutil.relativedelta.relativedelta" cuando se trabaja solo con días?
strftime python (3)
Un relativedelta
tiene muchos más parámetros que 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)
Con lo que puedes hacer cosas como calcular el último viernes de un mes:
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)
¿Cuál es la diferencia entre datetime.timedelta
(de la biblioteca estándar de Python) y dateutil.relativedelta.relativedelta
cuando se trabaja solo con días?
Según tengo entendido, timedelta
solo admite días (y semanas), mientras que relativedelta
agrega soporte para períodos definidos en términos de años, meses, semanas o días, así como la definición de valores absolutos para el año, el mes o el día. (recuerde, para los fines de esta pregunta, no tengo que preocuparme por horas, minutos o segundos)
Teniendo en cuenta que solo estoy trabajando con objetos datetime.date
, y solo me interesan los períodos definidos por el número de días, ¿cuál es la diferencia entre timedelta
y relativedelta
? ¿Hay alguna diferencia?
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)
Una diferencia importante que no se destaca en otras respuestas es la presencia de sustantivos singulares y plurales para cada primitiva de diferencia de tiempo. Mientras que timedelta
solo ofrece nombres en plural (por ejemplo, hours
, days
) para denotar la diferencia de tiempo relativedelta
, relativedelta
ofrece nombres en singular (por ejemplo, hour
, day
) para denotar información de tiempo absoluta.
Esto queda claro a partir de la definición de las 2 clases:
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)
Ahora, ¿exactamente qué hace la forma singular? La forma singular crea un delta que, cuando se agrega a un objeto de datetime
y datetime
, establece esa primitiva de fecha / hora específica en el objeto de datetime
a la mencionada en el relativedelta
. Aquí hay un pequeño ejemplo:
>>> 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)
Esto puede llevar a que se use relativedelta
para algunas aplicaciones interesantes, lo que puede ser complicado de implementar utilizando timedelta
. Uno que rápidamente viene a la mente es el redondeo.
Una aplicación interesante: redondeando rápidamente
Ahora le mostraré cómo es relativista la expresividad cuando se redondea un objeto de datetime
y datetime
al minuto, hora, día, etc. más cercano.
Redondeando a la hora más cercana:
Observe lo sencillo que es redondear utilizando 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)
Otros redondeos más complicados son fácilmente alcanzables utilizando relativedelta
. Sin embargo, tenga en cuenta que todos los redondeos que se pueden hacer por relativedelta
también se pueden hacer usando las funciones de datetime
y timedelta
, solo de una manera un poco más complicada.
dateutil
es un paquete de extensión para el módulo datetime
estándar de python. Como usted dice, proporciona funcionalidad adicional, como timedeltas que se expresan en unidades más grandes que un día.
Esto es útil si tiene que hacer preguntas, por ejemplo, ¿cuántos meses puedo ahorrar antes de que llegue el cumpleaños de mi novia o cuál es el último viernes del mes? Esto oculta cálculos complejos que son causados por las diferentes duraciones de los meses, o días adicionales en años bisiestos.
En su caso, solo le interesa el número de días. Por lo tanto, es mejor usar timedelta
ya que esto evita una dependencia adicional del paquete dateutil
.