# How to create sequential numbers in a field by defining automatically the start, end and interval numbers?

I would like to create sequential numbers in a field called "virtual _Li". I have used the field calculator using `def autoincrement()` function and manually calculate the interval number. https://support.esri.com/en/technical-article/000011137 But I would like to have it in python.

The start point should be always the number in `“Z_2018”` that has `“0”` in `“First_Dist”` (Start = 1.006). End number is the number in `“Z_2018”` that has the Maximum number in `“FIRST_DIST”` (End = 1.04).

The interval is:`( (End) – (Start) ) / ( max in “FIRST_DIST” field/a constant number )`

Constant number is always = 0.15

Start and end number can be `+` or `–` number.

In this case interval is `0.002875793`

``````( (1.040) –  (1.006) ) / (1.773424/0.15) = 0.002875793
``````

First create a field:

``````arcpy.AddField_management(ProfileGraph1WR1, "Virtual_Li", "DOUBLE", 10, 3)
``````

then I need to create a “codeblock” and “Expression” which I don’t know How.

• To confirm, this is working within the ArcMap window but you are just looking to convert it to arcpy? – smiller Oct 24 '18 at 14:11
• Yes! it works with field calculator in ArcMap and manually calculating the Interval. but I want it automatically with arcpy. – Anahita Kp Oct 24 '18 at 14:14
• I think I'm still missing how you are making the choice for increment value, but the answer below has the base code for making the codeblock/expression for use in arcpy. – smiller Oct 24 '18 at 14:25

Code Example 3 on Esri's documentation for Calculate Field is probably the closest to your question.

Since you have up through the AddField, the code below proceeds from there based on that example.

``````with arcpy.da.SearchCursor("ProfileGraph1WR1", ["First_Dist", "Z_2018"]) as cursor:
firstdistvals = dict()
for row in cursor:
if row == 0:
startval = row
firstdistvals[row] = row
maxval = max(firstdistvals.keys())
endval = firstdistvals[maxval]

# Set local variables
inTable = "ProfileGraph1WR1"
fieldName = ""Virtual_Li"
expression = "autoIncrement({}, {}, {})".format(startval, endval, maxval)

codeblock = """
rec = 0
def autoIncrement(start, end, maximum):
global rec
const = 0.15
pStart = float(start)
pInterval = (float(end) – float(start))  / (float(maximum)/const)
if (rec == 0):
rec = pStart
else:
rec += pInterval
return rec"""

# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName, expression, "PYTHON_9.3", codeblock)
``````
• How the code calculate the interval? I want it automatically calculated. – Anahita Kp Oct 24 '18 at 14:26
• I'll add in SearchCursor based checks to determine start/end. – smiller Oct 24 '18 at 14:30
• Updated answer posted; please test – smiller Oct 24 '18 at 14:43
• I got error:ExecuteError: Failed to execute. Parameters are not valid. ERROR 000800: The value is not a member of VB | PYTHON | PYTHON_9.3. ERROR 000989: Python syntax error: Parsing error IndentationError: unexpected indent (line 2) Failed to execute (CalculateField). – Anahita Kp Oct 24 '18 at 14:54
• it works, my python gives error because of the spaces in PInterval. now it works :pInterval = (float(end)-float(start))/(float(maximum)/const). Thanks! – Anahita Kp Oct 25 '18 at 9:10