Ejemplos de Calcular campo en Python

Introducir valores con el teclado no es la única forma de editar los valores de una tabla. Es posible que desee realizar un cálculo matemático para establecer el valor de un campo para un único registro o incluso para todos los registros. Puede realizar cálculos simples y avanzados en todos los registros o en registros seleccionados. Además, puede calcular área, longitud, perímetro y otras propiedades geográficas en campos de tablas de atributos. Las siguientes secciones incluyen ejemplos del uso de la calculadora de campo. Los cálculos se realizan con Python, SQL y Arcade.

Este tema se centra en los ejemplos basados en Python de Calcular campo. Para obtener más información sobre las expresiones de Arcade, consulte la Guía de ArcGIS Arcade. Para obtener más información sobre las expresiones de SQL, consulte Calcular valores de campo. Para obtener más información sobre los ejemplos de VBScript, consulte Ejemplos de Calcular campo de VBScript.

Nota:
  • Python aplica la sangría como parte de la sintaxis. Utilice dos o cuatro espacios para definir cada nivel lógico. Alinee el principio y el final de los bloques de sentencias, y sea coherente.
  • Los campos de expresión de cálculo de Python se encuentran entre signos de exclamación (!!).
  • Cuando nombre variables, recuerde que Python distingue entre mayúsculas y minúsculas, de manera que value no es lo mismo que Value.
  • Después de introducir las sentencias, puede hacer clic en el botón Exportar Exportar si desea escribirlas en un archivo. El botón Importar Import le solicitará que busque y seleccione un archivo de cálculo existente.

Cálculos simples

Solo se puede calcular una variedad de cálculos con una expresión corta.

Ejemplos de cadenas sencillas

Varias funciones de cadenas de Python, incluidas capitalize, rstrip y replace, admiten cadenas de caracteres.

Poner en mayúscula el primer carácter de la cadena del campo CITY_NAME.

!CITY_NAME!.capitalize()

Eliminar cualquier espacio del final de la cadena en el campo CITY_NAME.

!CITY_NAME!.rstrip()

Sustituir las instancias de "california" por "California" en el campo STATE_NAME.

!STATE_NAME!.replace("california", "California")

Se puede acceder a los caracteres de un campo de cadena indexando y segmentando en Python. La indexación recupera los caracteres en una posición del índice; la segmentación recupera un grupo de caracteres. En la tabla siguiente considere que !fieldname! es una cadena de caracteres con el valor ""abcde"".

EjemploExplicaciónResultado

!fieldname![0]

El primer carácter

"a"

!fieldname![-2]

El penúltimo carácter

"d"

!fieldname![1:4]

El segundo, tercer y cuarto carácter

"bcd"

Python también admite el formato de cadena de caracteres con el método format().

Combinar FieldA y FieldB, separados por dos puntos.

"{}:{}".format(!FieldA!, !FieldB!)

Ejemplos de matemática sencillos

Python proporciona herramientas para procesar números. Python también admite una serie de funciones numéricas y matemáticas, incluidas math, cmath, decimal, random, itertools, functools y operator.

OperadorExplicaciónEjemploResultado

x + y

x más y

1,5 + 2,5

4,0

x - y

x menos y

3,3 - 2,2

1,1

x * y

x multiplicado por y

2,0 * 2,2

4,4

x / y

x dividido por y

4,0 / 1,25

3,2

x // y

x dividido por y (división truncada)

4,0 // 1,25

3,0

x % y

x módulo y

8 % 3

2

-x

expresión negativa de x

x = 5

-x

-5

+x

x no cambia

x = 5

+x

5

x ** y

x elevado a la potencia de y

2 ** 3

8

Multiplica por 2 los valores de un campo.

!Rank! * 2

Calcule el volumen de una esfera dado un campo de radio.

4.0 / 3.0 * math.pi * !Radius! ** 3
Nota:

Los campos Corto, Largo y Entero grande difieren en los siguientes rangos de números enteros que admiten:

  • Corto (entero de 16 bits): admite números enteros entre -(215) y 215 (-32.768 y 32.767)
  • Largo (entero de 32 bits): admite números enteros entre -(231) y 231 (-2.147.483.648 y 2.147.483.647)
  • Entero grande (entero de 64 bits): admite números enteros entre -(253) y 253 (-9.007.199.254.740.992 y 9.007.199.254.740.991)

Heredado:

En ArcGIS AllSource, se utiliza Python 3; en ArcGIS Desktop, se utiliza Python 2. Python 2 utiliza álgebra de números enteros, lo que significa que, al dividir dos valores enteros, siempre se obtendrá un valor entero (3 / 2 = 1). En Python 3, al dividir dos valores enteros, se obtiene un valor flotante (3 / 2 = 1.5).

Funciones integradas de Python

Python cuenta con cierto número de funciones integradas, incluidas max, min, round y sum.

Calcular el valor máximo de cada registro a partir de una lista de campos.

Expression:
max([!field1!, !field2!, !field3!])

Calcular la suma para cada registro a partir de la lista de campos.

Expression:
sum([!field1!, !field2!, !field3!])

Utilizar bloques de código

Con las expresiones de Python y el parámetro Bloque de código, puede realizar lo siguiente:

  • Utilice cualquier función de Python en la expresión.
  • Acceder a los objetos y las funciones de geoprocesamiento.
  • Acceder a las propiedades de geometría de entidad.
  • Acceder al nuevo operador de valor aleatorio.
  • Reclasificar valores con la lógica if-then-else.

Tipo de expresiónBloque de código

Python (palabra clave PYTHON3)

Es compatible con la funcionalidad de Python. El bloque de código se expresa con las funciones de Python (def). Las propiedades de geometría se expresan utilizando objetos de geoprocesamiento, como objetos de punto, cuando sea apropiado.

Arcade

Es compatible con la funcionalidad de Arcade.

SQL

Admite expresiones SQL.

Se implementaron expresiones SQL para mejorar la compatibilidad de los cálculos en servicios de entidades y geodatabases corporativas, especialmente en cuanto a rendimiento. En lugar de realizar los cálculos de una entidad o fila cada vez, se envía una única solicitud al servicio de entidades o a la base de datos.

Heredado:

En ArcGIS Desktop, la herramienta Calcular campo admite VB, PYTHON y PYTHON_9.3 como tipos de expresión. El tipo de expresión VB, que se admite en algunos productos, no se admite en productos de 64 bits, incluido ArcGIS AllSource.

Las palabras clave de PYTHON y PYTHON_9.3 se siguen admitiendo en ArcGIS AllSource para la compatibilidad con versiones anteriores, pero no se muestran como opciones. Los scripts de Python que utilizan estas palabras clave seguirán funcionando.

La única diferencia entre el tipo de expresión PYTHON3 y la palabra clave PYTHON_9.3 heredada es que PYTHON3 devuelve los valores de los campos de datos como objetos de Python datetime.

Nota:

El tipo de expresión PYTHON3 no tiene relación con la versión de Python instalada con ArcGIS AllSource. Se trata de la tercera palabra clave relacionada con Python históricamente (después de las palabras clave PYTHON y PYTHON_9.3 ahora ocultas).

Las funciones de Python se definen con la palabra clave def, seguida del nombre de la función y los argumentos de entrada de la función. Las funciones de Python se pueden escribir de modo que acepten cualquier número de argumentos de entrada (incluso ninguno). La función devuelve un valor mediante una sentencia return. El nombre de la función es elección suya (no utilice espacios ni números a la izquierda).

Nota:

Si no se devuelve explícitamente un valor de una función con una sentencia return, la función devuelve None.

Nota:

Python aplica la sangría como parte de la sintaxis. Utilice cuatro espacios para definir cada nivel lógico. Alinee el principio y el final de los bloques de sentencias, y sea coherente.

Muestras de código: matemática

Se pueden agregar expresiones matemáticas sencillas utilizando el parámetro Expresión y crear ejemplos más complejos utilizando los parámetros Expresión y Bloque de código.

Redondear el valor del campo a dos posiciones decimales.

Expression:
round(!area!, 2)

Utilizar el módulo de matemática para convertir metros a pies. La conversión se eleva a la potencia de 2 y se multiplica por el área.

Expression:
MetersToFeet((float(!shape.area!)))

Code Block:
import math
def MetersToFeet(area):
    return math.pow(3.2808, 2) * area

Calcular campos usando lógica con Python

Es posible incluir patrones lógicos en bloques de código utilizando las sentencias if, else y elif.

Clasificar basado en los valores de campo.

Expression:
Reclass(!WELL_YIELD!)

Code Block:
def Reclass(WellYield):
    if (WellYield >= 0 and WellYield <= 10):
        return 1
    elif (WellYield > 10 and WellYield <= 20):
        return 2
    elif (WellYield > 20 and WellYield <= 30):
        return 3
    elif (WellYield > 30):
        return 4

Ejemplos de código: geometría

Además de las siguientes muestras de código, consulte la sección Conversiones de unidades geométricas que aparece a continuación para obtener más información sobre la conversión de unidades geométricas.

Calcular el área de una entidad.

Expression:
!shape.area!

Calcular la coordenada X máxima de una entidad.

Expression:
!shape.extent.XMax!

Calcular el número de vértices de una entidad.

Expression:
getVertexCount(!shape!)

Code Block:
def getVertexCount(feat):    
    partnum = 0

    # Count the number of points in the current multipart feature
    partcount = feat.partCount
    pntcount = 0

    # Enter while loop for each part in the feature (if a singlepart 
    # feature, this will occur only once)
    while partnum < partcount:
        part = feat.getPart(partnum)
        pnt = part.next()

        # Enter while loop for each vertex
        while pnt:
            pntcount += 1   
            pnt = part.next()
   
            # If pnt is null, either the part is finished or there 
            # is an interior ring
            if not pnt: 
                pnt = part.next()
        partnum += 1
    return pntcount

Para una clase de entidad de puntos, cambiar la coordenada x de cada punto por 100.

Expression:
shiftXCoordinate(!SHAPE!)

Code Block:
def shiftXCoordinate(shape):
    shiftValue = 100
    point = shape.getPart(0)
    point.X += shiftValue
    return point

Conversiones de unidades geométricas

Las propiedades de área y longitud del campo de geometría se pueden modificar con tipos de unidades utilizando los métodos de geometría getArea y getLength.

Más información sobre las unidades lineales y de área admitidas en el geoprocesamiento

Consulte los objetos Polygon y Polyline para obtener más información.

Precaución:

Convertir las unidades de área de los datos a un sistema de coordenadas geográficas genera resultados dudosos, ya que los grados decimales no son coherentes en el globo.

Calcular la longitud de una entidad en yardas.

Expression:
!shape@getLength('PLANAR', 'YARDS')

Calcular el área de una entidad en acres.

Expression:
!shape@getArea('PLANAR', 'ACRES')

El área y la longitud geodésicas también pueden calcularse utilizando el tipo de método GEODESIC.

Consulte los objetos Polygon y Polyline para obtener más información.

Más información sobre las herramientas de geoprocesamiento y las unidades lineales y de área

Calcule la longitud geodésica de una entidad en yardas.

Expression:
!shape@getLength('GEODESIC', 'YARDS')

Calcule el área geodésica de una entidad en acres.

Expression:
!shape@getArea('GEODESIC', 'ACRES')

Ejemplos de código: campos de datos

La fecha y la hora se pueden calcular utilizando módulos de datetime y time.

Nota:

Para los cálculos relacionados con la transferencia de valores temporales entre distintos tipos de campo, considere utilizar como alternativa la herramienta Convertir campo temporal.

Calcular la fecha actual.

Expression:
time.strftime("%d/%m/%Y")

Calcular la fecha y hora actuales.

Expression:
datetime.now()

Calcular que la fecha sea el 15 de marzo de 2015, a las 13:30 horas.

Expression:
datetime(year=2015, month=3, day=15, hour=13, minute=30, second=0))

Calcular el número de días entre la fecha actual y el valor en un campo.

Expression:
datetime.now().day - !OID!

Calcular una fecha agregando 100 días al valor de fecha en un campo.

Expression:
!field1! + timedelta(days=100)

Code Block:
from datetime import timedelta

Calcular una cadena que representa la fecha utilizando el método ctime del módulo datetime. El ejemplo crea una cadena con el formato: 'Mon Feb 22 10:15:00 2021'.

Expression:
!field1!.ctime()

Calcular el día de la semana (por ejemplo, domingo) para un valor de fecha en un campo.

Expression:
!field1!.strftime('%A')

Calcula una cadena formateada a partir de un campo de fecha utilizando el método datetime del módulo strftime y una cadena de formato explícita. El ejemplo crea una cadena con el formato: '02/22/2021, 10:15:00'.

Expression:
!field1!.strftime("%m/%d/%Y, %H:%M:%S")

Calcular una fecha utilizando una cadena con formato ISO 860.

Expression:
'1969-07-21 02:56:00'

Calcular una fecha utilizando la convención de mes, día, año y hora.

Expression:
'July 1 2020 12:30:45'

Ejemplos de código: campos de solo hora

Calcular que la hora sea las 16:30 utilizando la función datetime del módulo time.

Expression:
time(hour=16, minute=30, second=0)

Code Block:
from datetime import time

Al calcular un campo de fecha en un campo de hora, se aplicará únicamente la parte de hora del objeto datetime.

Expression:
!date_field!

Ejemplos de código: campos de solo fecha

Nota:

Para los cálculos relacionados con la transferencia de valores temporales entre distintos tipos de campo, considere utilizar como alternativa la herramienta Convertir campo temporal.

Calcular la fecha para que sea el 31 de diciembre de 2000.

Expression:
datetime(2000, 12, 31)

Al calcular un campo de fecha en un campo de hora, se aplicará únicamente la parte de hora del objeto datetime.

Expression:
!date_field!

Ejemplos de código: campos de desfase de marca de tiempo

Nota:

Para los cálculos relacionados con la transferencia de valores temporales entre distintos tipos de campo, considere utilizar como alternativa la herramienta Convertir campo temporal.

Agregar un desfase de marca de tiempo UTC a la fecha y hora actuales mediante la propiedad datetime.timezone del módulo utc.

Expression:
datetime.now(tz=timezone.utc)

Code Block:
from datetime import timezone

Agregar un desfase de marca de tiempo a la fecha y hora actuales mediante la clase zoneinfo del módulo ZoneInfo para establecer el huso horario.

Expression:
datetime.now(ZoneInfo('America/New_York'))

Code Block:
from zoneinfo import ZoneInfo

Ejemplos de código: cadenas

Los cálculos de cadena de caracteres se pueden completar utilizando una variedad de patrones de codificación de Python.

Devolver los tres caracteres más a la derecha.

Expression:
!SUB_REGION![-3:]

Remplazar todas las instancias de una "P" mayúscula con una "p" minúscula.

Expression:
!STATE_NAME!.replace("P","p")

Concatenar dos campos con un separador de espacio

Expression:
!SUB_REGION! + " " + !STATE_ABBR!

Convertir a la primera letra de cada palabra en mayúscula y las demás en minúscula

Los siguientes ejemplos muestran diferentes formas de convertir palabras para que cada una de ellas tenga el primer carácter en mayúscula y el resto de las letras en minúscula.

Expression:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
Expression:
!STATE_NAME!.title()

Expresiones regulares

El módulo de Python re proporciona operaciones de concordancia de expresiones regulares que puede utilizar para realizar reglas de sustitución y concordancia de patrones complejos para cadenas.

Reemplazar St o St. al iniciar una nueva palabra al final de la cadena de caracteres con la palabra Street.

Expression:
update_street(!ADDRESS!)

Code Block:
import re
def update_street(street_name):
    return re.sub(r"""\b(St|St.)\Z""",  
                  'Street',
                  street_name)

Cálculos acumulativos y secuenciales

Los cálculos acumulativos y secuenciales se pueden realizar utilizando variables globales.

Calcular un número o Id. secuencial basado en un intervalo.

Expression:
autoIncrement(10, 5)

Code Block:
rec = 0
def autoIncrement(start=1, interval=1):
    global rec
    if rec == 0:
        rec = start
    else:
        rec += interval
    return rec

Calcular el valor acumulativo de un campo numérico.

Expression:
accumulate(!FieldA!)

Code Block:
total = 0
def accumulate(increment):
    global total
    if total:
        total += increment
    else:
        total = increment
    return total

Calcular el aumento del porcentaje de un campo numérico.

Expression:
percentIncrease(float(!FieldA!))

Code Block:
lastValue = 0
def percentIncrease(newValue):
    global lastValue
    if lastValue:
        percentage = ((newValue - lastValue) / lastValue)  * 100
    else: 
        percentage = 0
    lastValue = newValue
    return percentage

Valores aleatorios

Es posible calcular valores aleatorios utilizando el módulo random.

Utilizar el paquete del sitio de numpy para calcular valores flotantes aleatorios entre 0,0 y 1,0.

Expression:
getRandomValue()

Code Block:
import numpy

def getRandomValue():
    return numpy.random.random()

Utilizar el módulo random para calcular valores enteros aleatorios entre 0 y 10.

Expression:
random.randint(0, 10)

Code Block:
import random

Calcular valores nulos

En las expresiones de Python, es posible calcular valores nulos mediante una expresión de Python None.

Nota:

El siguiente cálculo solo funciona si el campo es anulable.

Utilice Python de None para calcular valores nulos.

Expression:
None

Temas relacionados