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 timedeltasolo ofrece sustantivos en plural (por ejemplo hours, days) para denotar la diferencia de tiempo relativa, también relativedeltaofrece 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 datetimeobjeto, establece esa primitiva de fecha / hora específica en el datetimeobjeto 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 relativedeltase 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 relativedeltaes más expresivo al redondear un datetimeobjeto 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 relativedeltatambién se pueden realizar mediante datetimefunciones y timedelta, solo de una manera un poco más complicada.
dateime.timedeltaque logrará lo que desea y evitará la dependencia deldateutilpaquete externo .