Qual é a diferença entre datetime.timedelta
(da biblioteca padrão do Python) e dateutil.relativedelta.relativedelta
ao trabalhar apenas com dias?
Pelo que entendi, timedelta
só suporta dias (e semanas), enquanto relativedelta
adiciona suporte para períodos definidos em termos de anos, meses, semanas ou dias, além de definir valores absolutos para ano, mês ou dia. (lembre-se, para o propósito desta pergunta, não preciso me preocupar com horas, minutos ou segundos)
Considerando que trabalho apenas com datetime.date
objetos, e apenas interessado em períodos definidos pelo número de dias, qual a diferença entre timedelta
e relativedelta
? Existe alguma diferença?
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
que vai conseguir o que você deseja e evitar a dependência dodateutil
pacote externo .Respostas:
dateutil
é um pacote de extensão para odatetime
módulo padrão python . Como você disse, ele fornece funcionalidade extra, como timedeltas que são expressos em unidades maiores que um dia.Isso é útil se você tiver que fazer perguntas como quantos meses posso economizar antes do aniversário da minha namorada ou qual é a última sexta-feira do mês? Isso oculta cálculos complexos causados por diferentes durações dos meses ou dias extras em anos bissextos.
No seu caso, você está interessado apenas no número de dias. Portanto, é melhor usar,
timedelta
pois isso evita uma dependência extra dodateutil
pacote.fonte
A
relativedelta
tem muito mais parâmetros do que atimedelta
:com o qual você pode fazer coisas como calcular a última sexta-feira em um mês:
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)
fonte
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
timedelta
apenas ofereça substantivos no plural (por exemplohours
,days
) para denotar a diferença de tempo relativa,relativedelta
oferece também substantivos no singular (por exemplohour
,day
) para denotar informações de tempo absoluto.Isso fica claro na definição das 2 classes:
Agora, exatamente o que a forma singular faz? A forma singular cria um delta que, quando adicionado a um
datetime
objeto, define aquela data / hora primitiva específica nodatetime
objeto para aquela mencionada norelativedelta
. 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) #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)
Isso pode levar ao
relativedelta
uso para alguns aplicativos interessantes, que podem ser complicados de implementar usandotimedelta
. Um que vem rapidamente à mente é o arredondamento.Um aplicativo interessante: arredondamento rápido
Vou agora mostrar como
relativedelta
é mais expressivo ao arredondar umdatetime
objeto para o minuto, hora, dia mais próximo, etc.Arredondando para a hora mais próxima:
Observe como é fácil arredondar usando
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)
Outros arredondamentos mais complicados são facilmente alcançáveis usando
relativedelta
. No entanto, note que todos os arredondamentos que podem ser feitos porrelativedelta
também podem ser feitos por meio dedatetime
funções etimedelta
, apenas de uma forma um pouco mais complicada.fonte