How to determine if dates match in Python?

I have an access table with a Date field. It has random dates for each entry. I created a script to add all entries to the list, and then set the list to filter only unique values:

dateList = [] # cursor search through each record and append all records in the date # field to a python list for row in rows: dateList.append(row.getValue("DATE_OBSERVATION").strftime('%m-%d-%Y')) # Filter unique values to a set newList = list(set(dateList)) 

This returns (in my test pattern):

['07 -06-2010 ', '06 -24-2010', '07 -05-2010 ', '06 -25-2010']

Now that I have unique values ​​for the DATE_OBSERVATION field, I want to determine if there are:

  • dates are single (i.e. only one unique date is returned, because this is the date in each record)
  • if the dates are a date range (i.e. all dates fall into a sequential range)
  • if the dates are multiple dates but are not in the range of consecutive dates

Any suggestions would be much appreciated! Mike

+4
source share
4 answers

Instead of rewinding your own consecutive function, you can simply convert date objects to integers using the .toordinal() method for datetime objects. The difference between the maximum and minimum value of a set of ordinal dates is greater than the length of the set:

 from datetime import datetime date_strs = ['07-06-2010', '06-24-2010', '07-05-2010', '06-25-2010'] # date_strs = ['02-29-2012', '02-28-2012', '03-01-2012'] # date_strs = ['01-01-2000'] dates = [datetime.strptime(d, "%m-%d-%Y") for d in date_strs] date_ints = set([d.toordinal() for d in dates]) if len(date_ints) == 1: print "unique" elif max(date_ints) - min(date_ints) == len(date_ints) - 1: print "consecutive" else: print "not consecutive" 
+9
source

Use your database to select unique dates in ascending order:

  • if the request returns a single date, this is your first time

  • Otherwise, find out if the dates are consecutive:

     import datetime def consecutive(a, b, step=datetime.timedelta(days=1)): return (a + step) == b 

Code Scheme:

 dates = <query database> if all(consecutive(dates[i], dates[i+1]) for i in xrange(len(dates) - 1)): if len(dates) == 1: # unique # 1st case: all records have the same date else: # the dates are a range of dates else: # non-consecutive dates 
0
source

Here my version uses the reduce () function.

 from datetime import date, timedelta def checked(d1, d2): """ We assume the date list is sorted. If d2 & d1 are different by 1, everything up to d2 is consecutive, so d2 can advance to the next reduction. If d2 & d1 are not different by 1, returning d1 - 1 for the next reduction will guarantee the result produced by reduce() to be something other than the last date in the sorted date list. Definition 1: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider consecutive Definition 2: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider not consecutive """ #if (d2 - d1).days == 1 or (d2 - d1).days == 0: # for Definition 1 if (d2 - d1).days == 1: # for Definition 2 return d2 else: return d1 + timedelta(days=-1) # datelist = [date(2014, 1, 1), date(2014, 1, 3), # date(2013, 12, 31), date(2013, 12, 30)] # datelist = [date(2014, 2, 19), date(2014, 2, 19), date(2014, 2, 20), # date(2014, 2, 21), date(2014, 2, 22)] datelist = [date(2014, 2, 19), date(2014, 2, 21), date(2014, 2, 22), date(2014, 2, 20)] datelist.sort() if datelist[-1] == reduce(checked, datelist): print "dates are consecutive" else: print "dates are not consecutive" 
0
source

Another version using the same logic as in my other answer.

 from datetime import date, timedelta # Definition 1: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider consecutive # Definition 2: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider not consecutive # datelist = [date(2014, 1, 1), date(2014, 1, 3), # date(2013, 12, 31), date(2013, 12, 30)] # datelist = [date(2014, 2, 19), date(2014, 2, 19), date(2014, 2, 20), # date(2014, 2, 21), date(2014, 2, 22)] datelist = [date(2014, 2, 19), date(2014, 2, 21), date(2014, 2, 22), date(2014, 2, 20)] datelist.sort() previousdate = datelist[0] for i in range(1, len(datelist)): #if (datelist[i] - previousdate).days == 1 or (datelist[i] - previousdate).days == 0: # for Definition 1 if (datelist[i] - previousdate).days == 1: # for Definition 2 previousdate = datelist[i] else: previousdate = previousdate + timedelta(days=-1) if datelist[-1] == previousdate: print "dates are consecutive" else: print "dates are not consecutive" 
0
source

Source: https://habr.com/ru/post/1400074/


All Articles