I am able to run a script that will calculate the time spent onsite using the datetime field for our service in and out times. The issue is the script stops (error) when it encounters a datetime field with no time in it (working on making sure that doesn't happen). I am wondering if there is a quick python addition I can add that when it encounters a datetime field with no time, it will skip over that record and keep running through the records. The records are a large amount and this is getting time consuming to keep starting the script at the next record after it error'd out on a record with no time in the field. I've attached a screenshot of an example.
Thanks!
datetime objects are the worst. I usually convert them to strings
This is an obviously awful way to check whether there is a time, in the absence of a... 'has_time'... property
>>> d datetime.datetime(2016, 4, 21, 13, 16, 22, 961326) >>> ds = str(d) >>> ds '2016-04-21 13:16:22.961326' >>> if " " in ds: print("no time") no time
I hope you get the drift, and I only recommend it in the absence a correct answer
if " " in str(yourdate): skip
else: do stuff
What about:
def fnElapsed(STRDTTM, ENDDTTM): from datetime import datetime if all((STRDTTM, ENDDTTM))): dateStart = datetime.strptime(STRDTTM, "%m/%d/%Y %I:%M:%S %p") dateEnd = datetime.strptime(ENDDTTM, "%m/%d/%Y %I:%M:%S %p") timeDiff = dateEnd - dateStart elapMin = timeDiff.total_seconds()/60 return elapMin
UPDATE: To elaborate a little.... Similar to other data types, when a cursor encounters a Date field with no value, i.e., a NULL, it returns a Python NoneType as opposed to a Python datetime.datetime. The Python all() built-in will return False if one of the fields returns a NoneType, effectively skipping those records without a start and end date.
You can check if the first format throws an error, and fix it if so. Also, you need to return the value in the end.
from datetime import datetime def fnElapsed(STRDTTM, ENDDTTM): try: dateStart = datetime.strptime(STRDTTM, "%d/%m/%Y %I:%M:%S %p") except: dateStart = datetime.strptime(STRDTTM, "%d/%m/%Y") try: dateEnd = datetime.strptime(ENDDTTM, "%d/%m/%Y %I:%M:%S %p") except: dateEnd = datetime.strptime(ENDDTTM, "%d/%m/%Y") timeDiff = dateEnd - dateStart return timeDiff.total_seconds()/60
note: my date formats are slightly different than yours.
Similar to above, you can return a dummy value instead of changing the datetime format to flag your records.
from datetime import datetime def fnElapsed(STRDTTM, ENDDTTM): try: dateStart = datetime.strptime(STRDTTM, "%d/%m/%Y %I:%M:%S %p") except: return 9999 try: dateEnd = datetime.strptime(ENDDTTM, "%d/%m/%Y %I:%M:%S %p") except: return -9999 timeDiff = dateEnd - dateStart return timeDiff.total_seconds()/60
Hi Chad
The following will deal with the blanks within your date fields:
def fnElapsed(STRDTTM, ENDDTTM): from datetime import datetime try: dateStart = datetime.strptime(STRDTTM, "%d/%m/%Y %I:%M:%S %p") dateEnd = datetime.strptime(ENDDTTM, "%d/%m/%Y %I:%M:%S %p") timeDiff = dateEnd - dateStart elapMin = timeDiff.total_seconds()/60 return elapMin except Exception as inst: print type(inst)
fnElapsed(!STRDTTM!, !ENDDTTM!)
In answer to your original question:
I am wondering if there is a quick python addition I can add that when it encounters a datetime field with no time, it will skip over that record and keep running through the records.
def fnElapsed(STRDTTM, ENDDTTM): from datetime import datetime try: dateStart = datetime.strptime(STRDTTM, "%m/%d/%Y %I:%M:%S %p") dateEnd = datetime.strptime(ENDDTTM, "%m/%d/%Y %I:%M:%S %p") timeDiff = dateEnd - dateStart elapMin = timeDiff.total_seconds()/60 return elapMin except: pass