Uma diferença importante não destacada em outras respostas é a presença de substantivos no singular e no plural para cada diferença de tempo primitiva. Embora timedeltaapenas ofereça substantivos no plural (por exemplo hours, days) para denotar a diferença de tempo relativa, relativedeltaoferece também substantivos no singular (por exemplo hour, day) para denotar informações de tempo absoluto.
Isso fica claro na definição das 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)
Agora, exatamente o que a forma singular faz? A forma singular cria um delta que, quando adicionado a um datetimeobjeto, define aquela data / hora primitiva específica no datetimeobjeto para aquela mencionada no relativedelta. Aqui está um pequeno exemplo:
>>> 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)
Isso pode levar ao relativedeltauso para alguns aplicativos interessantes, que podem ser complicados de implementar usando timedelta. Um que vem rapidamente à mente é o arredondamento.
Um aplicativo interessante: arredondamento rápido
Vou agora mostrar como relativedeltaé mais expressivo ao arredondar um datetimeobjeto para o minuto, hora, dia mais próximo, etc.
Arredondando para a hora mais próxima:
Observe como é fácil arredondar 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)
Outros arredondamentos mais complicados são facilmente alcançáveis usando relativedelta. No entanto, note que todos os arredondamentos que podem ser feitos por relativedeltatambém podem ser feitos por meio de datetimefunções e timedelta, apenas de uma forma um pouco mais complicada.
dateime.timedeltaque vai conseguir o que você deseja e evitar a dependência dodateutilpacote externo .