Hi all,
I have been having trouble with getting Calculatefield_management to accept my SQL expression variables. I have tried various ways to enter the variables to get the first two calculate field functions to work.
The error is now occurring with the 3rd calculate field/expression3/calculating the NA in the code below. [arcpy.CalculateField_management(inFeatures, fieldName3, expression3, "PYTHON_9.3")]
I get different errors depending on how I enter in the variable.
One of the errors I get while debugging now:
Traceback (most recent call last):
File "test.py", line 175, in <module>
arcpy.CalculateField_management(inFeatures, fieldName3, expression3, "PYTHON_9.3")
File "C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\management.py", line 3354, in CalculateField
raise e
ExecuteError: ERROR 999999: Error executing function.
The value type is incompatible with the field type. [NA]
Failed to execute (CalculateField).
Method
The first calculatefield updates the RG field based on the numbers in the !Join_Count! features column. RG is a short integer.
The second calculatefield updates the PG field which is (!RG!/sum of RG) * 100. PG should be a float since it's finding the percentage.
The third calcualtefield udpates the NA field which is !PG! * 12425. NA should be a short integer.
Any suggestions on how I can write expression3 to be the correct field type format for NA? Thanks.
My Background
-Novice Programmer
-Using the Python 2.75 Idle Shell
-Using ArcMap 10.2.1
Sample Code Snippet:
# Import ArcPy site-package to use Arcgis and os modules to use operating system
import arcpy, os, sys, string, numpy
from arcpy import env
env.overwriteOutput = True
#set environment settings to where mxd is saved
env.workspace = r'J:\folder\scripts'
#folders
output = r'J:\folder\scripts\output' + "\\"
inFeatures = output + "joined_" + c.name + "_" + w.name + ".dbf"
print inFeatures
#First Calculate Field from spatial join count numbers
fieldName = "RG" #SHORT
expression = '!Join_Count!' #LONG type
arcpy.CalculateField_management(inFeatures, fieldName, expression, "PYTHON_9.3")
print "Join Count numbers added to RG Field"
#Need sum of rg...
arr = arcpy.da.FeatureClassToNumPyArray(inFeatures, ('RG'))
# Sum the RG field
print "The total sum of features in RG is: "
rg_sum = arr["RG"].sum()
print rg_sum
flnum = "!RG!"
print flnum
#Calculate PG which equals (!RG!/Sum of !RG!) * 100
fieldName2 = "PG" #FLOAT type, it's a percentage number
arcpy.CalculateField_management(inFeatures, fieldName2, "(float('!RG!')) / " + str(rg_sum) + "* 100" , "PYTHON_9.3")
arr = arcpy.da.FeatureClassToNumPyArray(inFeatures, ('PG'))
PG_sum = arr["PG"].sum()
print "The total sum of features in PG is: " + str(PG_sum) #should equal 100.0
# Calculate NA, which equals !PG! * 12425
fieldName3 = "NA" #SHORT type, it needs to be a whole number
expression3 = "'!PG!' * 12425"
arcpy.CalculateField_management(inFeatures, fieldName3, expression3, "PYTHON_9.3")
arr = arcpy.da.FeatureClassToNumPyArray(inFeatures, ('NA'))
NA_sum = arr["NA"].sum()
print "The total sum of features in NA is: " + str(NA_sum) #needs to equal 12425
Solved! Go to Solution.
I changed NA to long and put int inside the variable like below and it now works!
Thanks for your suggestion for changing it to long!
|
And if I try the the code below to make PG float and make the whole result an integer, I get this error:
Traceback (most recent call last):
File "test.py", line 174, in <module>
expression3 = int("float('!PG!') * 12425")
ValueError: invalid literal for int() with base 10: "float('!PG!') * 12425"
expression3 = int("float('!PCTGROWTH!') * 12425")
arcpy.CalculateField_management(inFeatures, fieldName3, expression3, "PYTHON_9.3")
It seems your value is crossing the limit that short int can handle which is -32,768 to 32,767. You should change it to long.
HTH
Please remove the single quotes within your expression around field name. Change your expression to something like this:
"!PG!*12425"
I changed NA to long and put int inside the variable like below and it now works!
Thanks for your suggestion for changing it to long!
|