Cuál es la diferencia entre datetime.timedelta
(de la biblioteca estándar de Python) y dateutil.relativedelta.relativedelta
cuando se trabaja solo con días?
Hasta donde yo entiendo, timedelta
solo admite días (y semanas), mientras que relativedelta
agrega soporte para períodos definidos en términos de años, meses, semanas o días, además de definir valores absolutos para año, mes o día. (recuerde, para los propósitos de esta pregunta, no tengo que preocuparme por horas, minutos o segundos)
Teniendo en cuenta que solo trabajo con datetime.date
objetos y solo me interesan los períodos definidos por el número de días, ¿cuál es la diferencia entre timedelta
y relativedelta
? ¿Hay alguna diferencia?
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 logrará lo que desea y evitará la dependencia deldateutil
paquete externo .Respuestas:
dateutil
es un paquete de extensión para el estándar pythondatetime
módulo . Como usted dice, proporciona una funcionalidad adicional, como timedeltas que se expresan en unidades mayores a un día.Esto es útil si tiene que hacer preguntas como ¿cuántos meses puedo ahorrar antes de que llegue el cumpleaños de mi novia o cuál es el último viernes del mes? Esto oculta cálculos complejos causados por las diferentes duraciones de los meses o días adicionales en los años bisiestos.
En tu caso, solo te interesa la cantidad de días. Por lo tanto, es mejor usarlo
timedelta
ya que esto evita una dependencia adicional deldateutil
paquete.fuente
A
relativedelta
tiene muchos más parámetros que atimedelta
:con el que puedes hacer cosas como calcular el último viernes de un mes:
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)
fuente
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 ejemplohours
,days
) para denotar la diferencia de tiempo relativa, tambiénrelativedelta
ofrece sustantivos en singular (por ejemplohour
,day
) para denotar información de tiempo absoluto.Esto se desprende de la definición de las 2 clases:
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 eldatetime
objeto a la mencionada en elrelativedelta
. 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) #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)
Esto puede llevar a que
relativedelta
se utilice para algunas aplicaciones interesantes, que pueden ser complicadas de implementar utilizandotimedelta
. 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 undatetime
objeto al minuto, hora, día, etc.Redondeando a la hora más cercana:
Observe lo sencillo que es redondear 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)
Otros redondeos más complicados se pueden lograr fácilmente utilizando
relativedelta
. Sin embargo, tenga en cuenta que todos los redondeos que puede realizarrelativedelta
también se pueden realizar mediantedatetime
funciones ytimedelta
, solo de una manera un poco más complicada.fuente