Calculate Field (Data Management)
Summary
Calculates the values of a field for a feature class, feature layer, or raster catalog.
Usage
-
Python expressions can be created using properties from the Geometry object (type, extent, centroid, firstPoint, lastPoint, area, length, isMultipart, and partCount).
!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 (e.g. !shape.length@kilometers!). If the data is stored in a geographic coordinate system and a linear unit (for example, miles) is supplied, 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
- Areal unit of measure keywords:
-
In the tool dialog box, an expression can be entered directly into the Expression parameter, or interactively built using the Field Calculator.
-
When used with a selected set of features, such as those created from a query in Make Feature Layer or Select Layer by Attribute, this tool will only update the selected records.
-
The calculation can only be applied to one field per operation.
-
Existing field values will be overwritten. A copy of the input table should be made if you want to preserve the original values
-
For Python calculations, field names must be enclosed in exclamation points (!fieldname!).
For VB calculations, field names must be enclosed in square brackets ([fieldname]).
-
To calculate strings to text or character fields, in the dialog box the string must be double-quoted ("string"), or in scripting, the double-quoted string must also be encapsulated in single quotes ('"string"').
-
This tool can also be used to update character items. Expressions using a character string should be wrapped, using single quotes—for example, [CHARITEM] = 'NEW STRING'. However, if the character string has embedded single quotes, wrap the string using double quotes—for example, [CHARITEM] = "TYPE'A'".
-
To calculate a field to be a numeric value, enter the numeric value in the Expression parameter; no quotes around the value are required.
-
The arcgis.rand() function is supported by this tool when a Python expression is specified. The arcgis.rand() function has been created for ArcGIS tools and should not be confused with the Python Rand() function. The syntax for the available distributions for the arcgis.rand() function can be found at The distribution syntax for random values.
-
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 Code Block parameter allows you to create complex expressions. You can enter the code block directly on the dialog box, or as a continuous string in scripting.
-
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, hyberbolic functions, and mathematical constants. To learn more about the math module, see Python's 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 use ArcObjects, you will need to modify your calculations to work.
-
When calculating joined data, you cannot calculate the joined columns directly. 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 ArcMap. You can then perform calculations on this data separately. These changes will be reflected in the joined columns.
- Calculate Field examples
Syntax
Parameter | Explanation | Data Type |
in_table |
The table containing the field that will be updated with the new calculation. | Mosaic Layer; Raster Catalog Layer; Raster Layer; Table View |
field |
The field that will be updated with the new calculation. | Field |
expression |
The simple calculation expression used to create a value that will populate the selected rows. | SQL Expression |
expression_type (Optional) |
Specify the type of expression that will be used.
| String |
code_block (Optional) |
Allows for a block of code to be entered for complex expressions. | String |
Code Sample
The following Python window script demonstrates how to use the CalculateField function in immediate mode.
import arcpy
from arcpy import env
env.workspace = "C:/data"
arcpy.AddField_management("vegtable.dbf", "VEG_TYP2", "TEXT", "", "", "20")
arcpy.CalculateField_management("vegtable.dbf", "VEG_TYP2",
'!VEG_TYPE!.split(" ")[-1]', "PYTHON_9.3")
Use CalculateField to assign centroid values to new fields.
# Name: CalculateField_Centroids.py
# Description: Use CalculateField to assign centroid values to new fields
# Import system modules
import arcpy
from arcpy import env
try:
# Set environment settings
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")
except Exception as e:
# If an error occurred, print line number and error message
import traceback
import sys
tb = sys.exc_info()[2]
print("Line {0}".format(tb.tb_lineno))
print(e.message)
Use CalculateField with a code block to calculate values based on ranges.
# Name: CalculateField_Ranges.py
# Description: Use CalculateField with a codeblock to calculate values
# based on ranges
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
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)
Use CalculateField to assign random values to a new field.
# Name: CalculateField_Random.py
# Description: Use CalculateField to assign random values to a new field
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
env.workspace = "C:/data/airport.gdb"
# Set local variables
inFeatures = "parcels"
fieldName = "RndValue"
expression = "arcgis.rand('Integer 0 10')"
# Execute AddField
arcpy.AddField_management(inFeatures, fieldName, "LONG")
# Execute CalculateField
arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON_9.3")