Compare list of datetimes with datetime in Python

I have a list of datetime objects and would like to find those that are within a specific time period:

import datetime dates = [ datetime.datetime(2007, 1, 2, 0, 1), datetime.datetime(2007, 1, 3, 0, 2), datetime.datetime(2007, 1, 4, 0, 3), datetime.datetime(2007, 1, 5, 0, 4), datetime.datetime(2007, 1, 6, 0, 5), datetime.datetime(2007, 1, 7, 0, 6) ] #in reality this is a list of over 25000 dates mask = (dates>datetime.datetime(2007,1,3)) & \ (dates<datetime.datetime(2007,1,6)) 

However, this results in the following error: "TypeError: cannot compare datetime.datetime in a list"

How can I fix my code?

+7
source share
3 answers

If your dates list is in sorted order, you can use the bisect module:

 >>> import bisect >>> bisect.bisect_right(dates, datetime.datetime(2007,1,3)) 1 >>> bisect.bisect_left(dates, datetime.datetime(2007,1,6)) 4 

The .bisect_* functions return indexes in the dates list:

 >>> lower = bisect.bisect_right(dates, datetime.datetime(2007,1,3)) >>> upper = bisect.bisect_left(dates, datetime.datetime(2007,1,6)) >>> mask = dates[lower:upper] >>> mask [datetime.datetime(2007, 1, 3, 0, 2), datetime.datetime(2007, 1, 4, 0, 3), datetime.datetime(2007, 1, 5, 0, 4)] 
+8
source

You can mask numpy.array in the syntax you describe (but not in the list):

 import numpy as np date1 = np.array(dates) mask = (dates1 > datetime.datetime(2007,1,3)) & \ (dates1 < datetime.datetime(2007,1,6)) In [14]: mask Out[14]: array([False, True, True, True, False, False], dtype=bool) In [15]: dates1[mask] Out[15]: array([2007-01-03 00:02:00, 2007-01-04 00:03:00, 2007-01-05 00:04:00], dtype=object) 

(since this question is tagged numpy, maybe this is what you intended.)

+10
source
 import datetime dates = [ datetime.datetime(2007, 1, 2, 0, 1), datetime.datetime(2007, 1, 3, 0, 2), datetime.datetime(2007, 1, 4, 0, 3), datetime.datetime(2007, 1, 5, 0, 4), datetime.datetime(2007, 1, 6, 0, 5), datetime.datetime(2007, 1, 7, 0, 6) ] within = [date for date in dates if datetime.datetime(2007,1,3) < date < datetime.datetime(2007,1,6)] 

gives:

 [datetime.datetime(2007, 1, 3, 0, 2), datetime.datetime(2007, 1, 4, 0, 3), datetime.datetime(2007, 1, 5, 0, 4)] 
+5
source

All Articles