1

I have a list myList that contains relativedelta objects. I want to add all of these relativedeltas objects. I tried:

sum(myList)

but it gives TypeError.

TypeError: unsupported operand type(s) for +: 'int' and 'relativedelta'

Even though relativedelta objects can be added with + Opeartor

Code somehow:

from datetime import datetime
from dateutil.relativedelta import relativedelta

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)
myList.append(rdelta1)


rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(sum(myList))
Shaida Muhammad
  • 1,428
  • 14
  • 25

2 Answers2

2

This is because sum uses start value as 0.

>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers

    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may    reject non-numeric types.

For example, sum([1, 2]) is 0 + 1 + 2

>>> sum([1, 2])
3

sum([1, 2], start=7) is 7 + 1 + 2

>>> sum([1, 2], start=7)
10

So to solve this use one item(relativedelta object) as start argument and keep everything else in the iterable.

from datetime import datetime
from dateutil.relativedelta import relativedelta

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)

rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(sum(myList, rdelta1)) # so both start and items in `MyList` are `relativedelta` types.
Abdul Niyas P M
  • 18,035
  • 2
  • 25
  • 46
  • 1
    Nicely spotted! – mozway Oct 14 '21 at 07:33
  • relativedate objects are added via a for loop and I don't want to use an extra variable for storing rdelta1. In your answer, I have to do something before for loop like date1 = dates[0] and then use the usual for loop. – Shaida Muhammad Oct 14 '21 at 07:48
  • 1
    @ShaidaMuhammad Agree!, My post explains why `sum` raises error when adding `relativedelta` objects(As stated in your question) and how to get rid of it(using `sum` itself), But that does not mean it's the *pythonic* solution :). I would also recommend to use the `reduce ` function. – Abdul Niyas P M Oct 14 '21 at 07:55
  • @AbduNIyas Gotcha – Shaida Muhammad Oct 14 '21 at 10:40
0

Use reduce

from datetime import datetime
from dateutil.relativedelta import relativedelta
from functools import reduce

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)
myList.append(rdelta1)


rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(reduce(lambda x, y: x + y, myList))