months example create python datetime timedelta

python - example - ¿Cuál es la diferencia entre "datetime.timedelta" y "dateutil.relativedelta.relativedelta" cuando se trabaja solo con días?



strftime python (3)

Un relativedelta tiene muchos más parámetros que un timedelta :

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)

Con lo 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)

¿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?

Según tengo entendido, 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, así como la definición de valores absolutos para el año, el mes o el día. (recuerde, para los fines de esta pregunta, no tengo que preocuparme por horas, minutos o segundos)

Teniendo en cuenta que solo estoy trabajando con objetos datetime.date , 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)


Una diferencia importante que no se destaca en otras respuestas es la presencia de sustantivos singulares y plurales para cada primitiva de diferencia de tiempo. Mientras que timedelta solo ofrece nombres en plural (por ejemplo, hours , days ) para denotar la diferencia de tiempo relativedelta , relativedelta ofrece nombres en singular (por ejemplo, hour , day ) para denotar información de tiempo absoluta.

Esto queda claro a partir 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, ¿exactamente qué hace la forma singular? La forma singular crea un delta que, cuando se agrega a un objeto de datetime y datetime , establece esa primitiva de fecha / hora específica en el objeto de datetime a la mencionada en el relativedelta . Aquí hay 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 se use relativedelta para algunas aplicaciones interesantes, lo que puede ser complicado de implementar utilizando timedelta . Uno que rápidamente viene a la mente es el redondeo.

Una aplicación interesante: redondeando rápidamente

Ahora le mostraré cómo es relativista la expresividad cuando se redondea un objeto de datetime y datetime al minuto, hora, día, etc. más cercano.

Redondeando a la hora más cercana:

Observe lo sencillo que es redondear utilizando 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 son fácilmente alcanzables utilizando relativedelta . Sin embargo, tenga en cuenta que todos los redondeos que se pueden hacer por relativedelta también se pueden hacer usando las funciones de datetime y timedelta , solo de una manera un poco más complicada.


dateutil es un paquete de extensión para el módulo datetime estándar de python. Como usted dice, proporciona funcionalidad adicional, como timedeltas que se expresan en unidades más grandes que un día.

Esto es útil si tiene que hacer preguntas, por ejemplo, ¿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 que son causados ​​por las diferentes duraciones de los meses, o días adicionales en años bisiestos.

En su caso, solo le interesa el número de días. Por lo tanto, es mejor usar timedelta ya que esto evita una dependencia adicional del paquete dateutil .