---You have to know how the date field comes to you.
Please help! I am new to Python. I created a model in ModelBuilder. The last steps are to grab the attribute table of the feature class, sort MEAS column in ascending order and then subtract next value from current and load those values in the new field. (I have an empty field in the attribute table). I wrote a simple script, but all I could do is to sort the MEAS column and print values out. Could anybody be so kind and get me an example code?....
import arcgisscripting, sys, os, re import time, calendar, string, decimal def func_check_format(time_string): if time_string.find("/") == -1: print "Error: time string doesn't contain any '/' expected format \ is month/day/year hour:minutes:seconds" elif time_string.find(":") == -1: print "Error: time string doesn't contain any ':' expected format \ is month/day/year hour:minutes:seconds" list = time_string.split() if (len(list)) <> 2: print "Error time string doesn't contain and date and time separated \ by a space. Expected format is 'month/day/year hour:minutes:seconds'" def func_parse_time(time_string): ''' take the time value and make it into a tuple with 9 values example = "2004/03/01 23:50:00". If the date values don't look like this then the script will fail. ''' year=0;month=0;day=0;hour=0;minute=0;sec=0; time_string = str(time_string) l=time_string.split() if not len(l) == 2: gp.AddError("Error: func_parse_time, expected 2 items in list l got" + str(len(l)) + "time field value = " + time_string) raise Exception cal=l[0];cal=cal.split("/") if not len(cal) == 3: gp.AddError("Error: func_parse_time, expected 3 items in list cal got " + str(len(cal)) + "time field value = " + time_string) raise Exception ti=l[1];ti=ti.split(":") if not len(ti) == 3: gp.AddError("Error: func_parse_time, expected 3 items in list ti got " + str(len(ti)) + "time field value = " + time_string) raise Exception if int(len(cal[0]))== 4: year=int(cal[0]) month=int(cal[1]) day=int(cal[2]) else: year=int(cal[2]) month=int(cal[0]) day=int(cal[1]) hour=int(ti[0]) minute=int(ti[1]) sec=int(ti[2]) #formated tuple to match input for time functions result=(year,month,day,hour,minute,sec,0,0,0) return result #---------------------------------------------------------------------------- def func_time_diff(start_t,end_t): ''' Take the two numbers that represent seconds since Jan 1 1970 and return the difference of those two numbers in hours. There are 3600 seconds in an hour. 60 secs * 60 min ''' start_secs = calendar.timegm(start_t) end_secs = calendar.timegm(end_t) x=abs(end_secs - start_secs) #diff = number hours difference #as ((x/60)/60) diff = float(x)/float(3600) return diff #---------------------------------------------------------------------------- print "Executing getnextLTIME.py script..." try: gp = arcgisscripting.create(9.3) # set parameter to what user drags in fcdrag = gp.GetParameterAsText(0) psplit = os.path.split(fcdrag) folder = str(psplit[0]) #containing folder fc = str(psplit[1]) #feature class fullpath = str(fcdrag) gp.Workspace = folder fldA = gp.GetParameterAsText(1) # Timestamp field fldDiff = gp.GetParameterAsText(2) # Hours field # set the toolbox for adding the field to data managment gp.Toolbox = "management" # add the user named hours field to the feature class gp.addfield (fc,fldDiff,"double") #gp.addindex(fc,fldA,"indA","NON_UNIQUE", "ASCENDING") desc = gp.describe(fullpath) updateCursor = gp.UpdateCursor(fullpath, "", desc.SpatialReference, fldA+"; "+fldDiff, fldA) row = updateCursor.Next() count = 0 oldtime = str(row.GetValue(fldA)) #check datetime to see if parseable func_check_format(oldtime) gp.addmessage("Calculating " + fldDiff + " field...") while row <> None: if count == 0: row.SetValue(fldDiff, 0) else: start_t = func_parse_time(oldtime) b = str(row.GetValue(fldA)) end_t = func_parse_time(b) diff_hrs = func_time_diff(start_t, end_t) row.SetValue(fldDiff, diff_hrs) oldtime = b count += 1 updateCursor.UpdateRow(row) row = updateCursor.Next() gp.addmessage("Updated " +str(count+1)+ " rows.") #gp.removeindex(fc,"indA") del updateCursor del row except Exception, ErrDesc: import traceback;traceback.print_exc() print "Script complete."
That code worked, thanks! But when I define the 'NEW' field as date - I get 12:00 AM for all rows. When I define 'NEW' as double - it comes out as 0. Which is correct - 0 days. I tried to multiply by 24 to get hours - still zeros. Is there any way to solve that?
import arcpy import datetime, time #not sure if you need both of these myFile = "c:/gis/temp.shp" sortField = "theDate" newField = "NEW" rows = arcpy.UpdateCursor(myFile,"","","",sortField + " A") # sort by sort field firstTime = True for row in rows: if firstTime: previous = row.getValue(sortField) #in your first iteration you will not have anything to update you just need to get the value for the next iteration firstTime = False else: #row.setValue(newField, row.getValue(sortField) - previous) current = row.getValue(sortField) difference = current-previous # datetime.timedelta object (time difference) row.setValue(newField, difference.days) # number of days rows.updateRow(row) previous = current #get the value for the next iteration
for row in rows: if count != 0: # if this isn't the first time in the loop (ie. if you have a number to subtract) count = count + 1 row.blankcolumnname = row.MEAS - previous # make the blank column = current - previous rows.updateRow(row) # updates the whole row, now with a value for the blank column previous = row.MEAS # sticks the current value into the previous variable for the next time through the loop else: # do this if it is the first time in the loop count = 1 previous = row.MEAS
import arcpy myFile = "c:/gis/temp.shp" sortField = "MEAS" newField = "NEW" rows = arcpy.UpdateCursor(myFile,"","","",sortField + " A") # sort by sort field firstTime = True for row in rows: if firstTime: previous = row.getValue(sortField) #in your first iteration you will not have anything to update you just need to get the value for the next iteration firstTime = False else: row.setValue(newField, row.getValue(sortField) - previous) rows.updateRow(row) previous = row.getValue(sortField) #get the value for the next iterationexcept: del row del rows
import arcpy
rows = arcpy.UpdateCursor(FILL IN YOUR PARAMETERS HERE)
rows = UpdateCursor(...) count = 0 for row in rows: if count != 0: # if this isn't the first time in the loop (ie. if you have a number to subtract) count = count + 1 row.blankcolumnname = row.MEAS - previous # make the blank column = current - previous rows.updateRow(row) # updates the whole row, now with a value for the blank column previous = row.MEAS # sticks the current value into the previous variable for the next time through the loop del row del rows # remove row locks
firstTime = True for row in rows: if firstTime: myMeas = row.getValue('MEAS') #in your first iteration you will not have anything to update you just need to get the value for the next iteration firstTime = False else: row.setValue('MEASCalc', row.getValue('MEAS') - myMeas rows.updateRow(row) myMeas = row.getValue('MEAS') #get the value for the next iteration
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.