Una delle principali differenze non evidenziate in altre risposte è la presenza di sostantivi singolari e plurali per ogni primitiva di differenza di tempo. Mentre timedeltasolo le offerte plurale nomi (ad esempio hours, days) per denotare relativa differenza di tempo, relativedeltaofferte sostantivi singolari pure (ad esempio hour, day) per indicare informazioni di tempo assoluto.
Questo risulta chiaro dalla definizione delle 2 classi:
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)
Ora, cosa fa esattamente la forma singolare? La forma singolare crea un delta che, quando aggiunto a un datetimeoggetto, imposta quella primitiva data / ora specifica datetimenell'oggetto a quella menzionata nel file relativedelta. Ecco un piccolo esempio:
>>> 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)
Questo può portare ad relativedeltaessere utilizzato per alcune applicazioni interessanti, che possono essere complicate da implementare utilizzando timedelta. Uno che viene subito in mente è l'arrotondamento.
Un'applicazione interessante: arrotondamento rapido
Ora ti mostrerò come relativedeltaè più espressivo quando si arrotonda un datetimeoggetto al minuto, all'ora, al giorno più vicini, ecc.
Arrotondare all'ora più vicina:
Nota quanto è semplice arrotondare 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)
Altri arrotondamenti più complicati sono facilmente realizzabili utilizzando relativedelta. Tuttavia, si noti che tutti gli arrotondamenti che possono essere eseguiti relativedeltapossono essere eseguiti anche utilizzando le datetimefunzioni e timedelta, solo in un modo leggermente più complesso.
dateime.timedeltache otterrà ciò che desideri ed eviterà la dipendenza daldateutilpacchetto esterno .