Python date check

I'm trying to think about how to do this in a better pythonic way. Now the only way I can think of is to overdo it.

The user enters the date (via the command line) in one of the following ways (e.g. / mypy.py date = '20110909.00 23')

date='20110909' date='20110909.00 23' date='20110909.00 20110909.23' 

All three examples should have the same result, no matter if it fills the list (which I can sort), for example

 ['20110909.00', '20110909.23] 

or even two sorted separate variables, but in all cases it is YYYYMMDD.HH, and you need to make sure that it is really a date, not a text.

Any ideas?

Thanks.

+++++ EDIT +++++ After connecting to this, I think I needed to do a lot of date / manipulation checks in the first place. Everything seems to work just fine. Except at the very end, I run the list through a date check, and it fails every time - even when it should pass.

(I run it with). /test.py date = '20110909.00 23'

(or any date option - that is, date = '20 22 'or date =' 20110909 'or date =' 20110909.00 23 ', etc.)

 import sys, re, time, datetime now = datetime.datetime.now() tempdate=[] strfirstdate=None strtempdate=None temparg2 = sys.argv del temparg2[0] tempdate = temparg2[0].replace('date=','') date = tempdate.split(' '); tempdate=[] date.sort(key=len, reverse=True) result = None # If no date is passed then create list according to [YYMMDD.HH, YYMMDD.HH] if date[0] == 'None': tempdate.extend([now.strftime('%Y%m%d.00'), now.strftime('%Y%m%d.%H')]) # If length of date list is 1 than see if it is YYMMDD only or HH only, and create list according to [YYMMDD.HH, YYMMDD.HH] elif len(date) == 1: if len(date[0]) == 8: tempdate.extend([ date[0] + '.00', date[0] + '.23']) elif len(date[0]) == 2: tempdate.extend([now.strftime('%Y%m%d') + '.' + date[0], now.strftime('%Y%m%d') + '.' + date[0]]) else: tempdate.extend([date[0], date[0]]) # iterate through list, see if value is YYMMDD only or HH only or YYYYMMDD.HH, and create list accoring to [YYYYMMDD.HH, YYYYMMDD.HH] - maximum of 2 values else: for _ in range(2): if len(date[_]) == 8: strfirstdate = date[0] tempdate.append([ date[_] + '.00']) elif len(date[_]) == 2: if _ == 0: # both values passed could be hours only tempdate.append(now.strftime('%Y%m%d') + '.' + date[_]) else: # we must be at the 2nd value passed. if strfirstdate == None: tempdate.append(now.strftime('%Y%m%d') + '.' + date[_]) else: tempdate.append(strfirstdate + '.' + date [_]) else: strfirstdate = date[0][:8] tempdate.append(date[_]) tempdate.sort() for s in tempdate: try: result = datetime.datetime.strptime(s, '%Y%m%d.%H') except: pass if result is None: print 'Malformed date.' else: print 'Date is fine.' print tempdate 

++++ Edit 2 ++++ If I remove the bottom (after tempdate.sort ()) and replace it with this.

 strfirstdate = re.compile(r'([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]+\.[0-9][0-9])') for s in tempdate: if re.match(strfirstdate, s): result = "validated" else: print "#####################" print "#####################" print "## error in date ##" print "#####################" print "#####################" exit 

It will be checked correctly.

This whole method does not seem to be very pythonic.

+4
source share
4 answers

You can create a mask and parse it using try...except to determine if the date string matches one of many masks. I had this code for the project, so I changed it a bit:

 from time import mktime, strptime from datetime import datetime date = '20110909.00 20110909.23'.split(' ')[0] result = None for format in ['%Y%m%d', '%Y%m%d.%H']: try: result = datetime.strptime(date, format) except: pass if result is None: print 'Malformed date.' else: print 'Date is fine.' 
+7
source

I found some problems when I tried to use the try..except code example in my own analysis, so there was a version with corrections added by me, and I also addressed the issue of processing only part of the hour:

 from datetime import datetime dates = ['20110909.00','20110909.23','13','20111212','20113131'] def dateTest(date): dateOk = False for format in ['%Y%m%d', '%Y%m%d.%H', '%H']: try: result = datetime.strptime(date, format) dateOk = (date == result.strftime(format)) # this makes sure the parsed date matches the original string if format == '%H': # this handles the hour only case date = '%s.%s' % (datetime.now().strftime('%Y%m%d'), date) except: pass if dateOk: print 'Date is fine.' else: print 'Malformed date.' return date for date in dates: print date print dateTest(date) print '' 
+1
source

Take a look at the time module. In particular, see the time.strptime () function .

There is also a fairly simple conversion between time values ​​and datetime objects.

0
source

Does this help you?

 from datetime import datetime import re reg = re.compile('(\d{4})(\d\d)(\d\d)' '(?:\.(\d\d)(\d\d)?(\d\d)? *' '(?:(\d{4})(\d\d)(\d\d)\.)?(\d\d)(\d\d)?(\d\d)? *)?') for x in ('20110909', '20110909.00 23', '20110909.00 74', '20110909.00 20110909.23', '20110909.00 19980412.23', '20110909.08 20110909.23', '20110935.08 20110909.23', '20110909.08 19970609.51'): print x gr = reg.match(x).groups('000') try: x1 = datetime(*map(int,gr[0:6])) if gr[6]=='000': if gr[9]=='000': x2 = x1 else: y = map(int,gr[0:3] + gr[9:12]) try: x2 = datetime(*y) except: x2 = "The second part isn't in range(0,25)" else: y = map(int,gr[6:12]) try: x2 = datetime(*y) except: x2 = "The second part doesn't represent a real date" except: x1 = "The first part dosen't represent a real date" x2 = '--' print [str(x1),str(x2)],'\n' 

result

 20110909 ['2011-09-09 00:00:00', '2011-09-09 00:00:00'] 20110909.00 23 ['2011-09-09 00:00:00', '2011-09-09 23:00:00'] 20110909.00 74 ['2011-09-09 00:00:00', "The hour in the second part isn't in range(0,25)"] 20110909.00 20110909.23 ['2011-09-09 00:00:00', '2011-09-09 23:00:00'] 20110909.00 19980412.23 ['2011-09-09 00:00:00', '1998-04-12 23:00:00'] 20110909.08 20110909.23 ['2011-09-09 08:00:00', '2011-09-09 23:00:00'] 20110935.08 20110909.23 ["The first part dosen't represent a real date", '--'] 20110909.08 19970609.51 ['2011-09-09 08:00:00', "The second part doesn't represent a real date"] 

.

Note that groups('000') replace No with '000' for each group No

0
source

All Articles