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


¿Cuál es la diferencia entre datetime.timedelta (de la biblioteca estándar de Python) ydateutil.relativedelta.relativedelta cuando se trabaja solo con días?

Por lo que 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, así como 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)

Considerando que sólo estoy trabajando con datetime.date objetos, y solo interesado en 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)
Author: Denilson Sá Maia, 2012-09-15

2 answers

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

Esto es útil si tienes 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 que son causados por las diferentes longitudes de los meses, o días adicionales en años bisiestos.

En su caso, usted solo está interesado en el número de días. Así que es mejor usar timedelta ya que esto evita una dependencia adicional del paquete dateutil.

 47
Author: Hans Then,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-06 15:18:58

A relativedelta tiene muchos más parámetros que a 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 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)
 16
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-15 11:18:20