Una diferencia importante que no se destaca en otras respuestas es la presencia de sustantivos en singular y plural para cada primitiva de diferencia de tiempo. Aunque timedelta
solo ofrece sustantivos en plural (por ejemplo hours
, days
) para denotar la diferencia de tiempo relativa, también relativedelta
ofrece sustantivos en singular (por ejemplo hour
, day
) para denotar información de tiempo absoluto.
Esto se desprende 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, ¿qué hace exactamente la forma singular? La forma singular crea un delta que cuando se agrega a un datetime
objeto, establece esa primitiva de fecha / hora específica en el datetime
objeto a la mencionada en el relativedelta
. He aquí 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)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
Esto puede llevar a que relativedelta
se utilice para algunas aplicaciones interesantes, que pueden ser complicadas de implementar utilizando timedelta
. Uno que viene rápidamente a la mente es el redondeo.
Una aplicación interesante: redondeo rápido
Ahora le mostraré cómo relativedelta
es más expresivo al redondear un datetime
objeto al minuto, hora, día, etc.
Redondeando a la hora más cercana:
Observe lo sencillo que es redondear usando 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)
Otros redondeos más complicados se pueden lograr fácilmente utilizando relativedelta
. Sin embargo, tenga en cuenta que todos los redondeos que puede realizar relativedelta
también se pueden realizar mediante datetime
funciones y timedelta
, solo de una manera un poco más complicada.
dateime.timedelta
que logrará lo que desea y evitará la dependencia deldateutil
paquete externo .