BLNT
BLNT

Reputation: 136

find max of datetime list if it has None

I have a list with DateTime objects inside it along with None values and I need to get the max date of the list.

a =
[datetime.datetime(2020, 9, 25, 0, 0)]
[]
[None]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[None]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[None]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[None]
[]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[None]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[None]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[]
[datetime.datetime(2020, 9, 24, 0, 0)]
[datetime.datetime(2020, 9, 24, 0, 0)]
[None, datetime.datetime(2020, 9, 24, 0, 0), None]

I tried to get max date with

return max(a)

and I got this error


TypeError: '>' not supported between instances of 'datetime.datetime' and 'None Type'

how to do this in a proper way?. Ask for clarification if needed.

Upvotes: 0

Views: 1258

Answers (2)

mind_overflow
mind_overflow

Reputation: 101

Try this, you can also specify a "default" value:

from datetime import datetime

a = [None, None, datetime(2022,12,31), datetime(2022,1,1)]
b = [None, None]
c = [] # also works with an empty list

m1 = max((x for x in a if x is not None), default=None)
m2 = max((x for x in b if x is not None), default=None)
m3 = max((x for x in c if x is not None), default=datetime.now())

print((m1,m2,m3))

#output: 
# (datetime.datetime(2022, 12, 31, 0, 0), 
# None, 
# datetime.datetime(2023, 3, 31, 21, 16, 53, 840850))

Upvotes: 0

QuarticCat
QuarticCat

Reputation: 1526

Just filter None elements at first.

max(x for x in a if x is not None)

Upvotes: 3

Related Questions