The Calculate Field tool is located in the Data Management toolbox in the Fields toolset. This is the same tool that is opened when you click the Field Calculator command from the field context menu of an attribute table. When performing field calculations, it is important to know what type of data you are using and in what context it is going to be used in the future. The syntax that must be used in a calculation expression differs depending on the data source and scripting language.
The following includes a number of important tips and best practices for using the Calculate Field tool.
Tips and best practices for using the Calculate Field tool
Calculates the values of a field for a feature class, feature layer, or raster.
Expressions can be created using VBScript or a standard Python format. The formatting style of the string used for the expression should be appropriate for the environment (type).
Python expressions can be created using properties from the Geometry object including type, extent, centroid, firstPoint, lastPoint, area, length, isMultipart, and partCount (for example, !shape.area!).
Python expressions can use the geometry area and length properties with an areal or linear unit to convert the value to a different unit of measure (for example, !shape.length@kilometers!). If the data is stored in a geographic coordinate system and a linear unit is supplied (for example, miles), the length will be calculated using a geodesic algorithm. Using areal units on geographic data will yield questionable results as decimal degrees are not consistent across the globe.
- Areal unit of measure keywords:
- ACRES | ARES | HECTARES | SQUARECENTIMETERS | SQUAREDECIMETERS | SQUAREINCHES | SQUAREFEET | SQUAREKILOMETERS | SQUAREMETERS | SQUAREMILES | SQUAREMILLIMETERS | SQUAREYARDS | SQUAREMAPUNITS | UNKNOWN
- Linear unit of measure keywords:
- CENTIMETERS | DECIMALDEGREES | DECIMETERS | FEET | INCHES | KILOMETERS | METERS | MILES | MILLIMETERS | NAUTICALMILES | POINTS | UNKNOWN | YARDS
The calculation can only be applied to one field per operation.
Fields are always enclosed in brackets [ ] for VBScript.
For Python calculations, field names must be enclosed in exclamation points (!fieldname!).
To calculate strings to text or character fields, on the dialog box, the string must use double quotation marks ("string"), or in scripting, the string using double quotation marks must also be encapsulated in single quotation marks ('"string"').
This tool can also be used to update character items. Expressions using a character string should be wrapped using single quotation marks, for example, [CHARITEM] = 'NEW STRING'. However, if the character string has embedded single quotation marks, wrap the string using double quotation marks, for example, [CHARITEM] = "TYPE'A'".
To calculate a field to be a numeric value, enter the numeric value in the Expression parameter; no quotation marks around the value are required.
The arcgis.rand() function is supported by the Calculate Field tool, and the expression type must be Python. The arcgis.rand() function was created for ArcGIS tools and should not be confused with the Python Rand() function.
The expression and code block are connected. The code block must relate back to the expression; the result of the code block should be passed into the expression.
The Python math module and formatting are available for use in the Code Block parameter. You can import additional modules. The math module provides number-theoretic and representation functions, power and logarithmic functions, trigonometric functions, angular conversion functions, hyperbolic functions, and mathematical constants. To learn more about the math module, see the Python help.
Saved VB .cal files from previous versions of ArcGIS may work or require minimal modifications. If you have VBA code from past releases that uses ArcObjects, you will need to modify your calculations.
When calculating joined data, you cannot directly calculate the joined columns. However, you can directly calculate the columns of the origin table. To calculate the joined data, you must first add the joined tables or layers to the map. You can then perform calculations on this data separately. These changes will be reflected in the joined columns.
The expression type must be Python when running Calculate Field with ArcGIS Engine Runtime or ArcGIS Server. Only use Python as the expression type whenever the tool is included in a model that will be published to ArcGIS Server.
Code block examples using the Calculate Field tool
CalculateField example 2 (stand-alone script)
Use CalculateField to assign centroid values to new fields.
# Name: CalculateField_centroids.py # Import system modules import arcpy # Set environment settings arcpy.env.workspace = "C:/data/airport.gdb" # Set local variables inFeatures = "parcels" fieldName1 = "xCentroid" fieldName2 = "yCentroid" fieldPrecision = 18 fieldScale = 11 # Add fields arcpy.AddField_management(inFeatures, fieldName1, "DOUBLE", fieldPrecision, fieldScale) arcpy.AddField_management(inFeatures, fieldName2, "DOUBLE", fieldPrecision, fieldScale) # Calculate centroid arcpy.CalculateField_management(inFeatures, fieldName1, "!SHAPE.CENTROID.X!", "PYTHON_9.3") arcpy.CalculateField_management(inFeatures, fieldName2, "!SHAPE.CENTROID.Y!", "PYTHON_9.3")
CalculateField example 3 (stand-alone script)
Use CalculateField with a code block to calculate values based on ranges.
# Name: CalculateField_ranges.py # Import system modules import arcpy # Set environment settings arcpy.env.workspace = "C:/data/airport.gdb" # Set local variables inTable = "parcels" fieldName = "areaclass" expression = "getClass(float(!SHAPE.area!))" codeblock = """ def getClass(area): if area <= 1000: return 1 if area > 1000 and area <= 10000: return 2 else: return 3""" # Execute AddField arcpy.AddField_management(inTable, fieldName, "SHORT") # Execute CalculateField arcpy.CalculateField_management(inTable, fieldName, expression, "PYTHON_9.3", codeblock)
CalculateField example 4 (stand-alone script)
Use CalculateField to assign random values to a new field.
# Name: CalculateField_Random.py # Import system modules import arcpy import random # Set environment settings arcpy.env.workspace = "C:/data/airport.gdb" # Set local variables inFeatures = "parcels" fieldName = "RndValue" expression = "random.randint(0, 10)" code_block = "import random" # Execute AddField arcpy.AddField_management(inFeatures, fieldName, "LONG") # Execute CalculateField arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON_9.3", code_block)