Básico If / Then en Python Parser of ArcGIS Field Calculator?

18

Estoy usando ArcGIS 10.2 para escritorio, y he estado buscando en este sitio, y parece que todavía no puedo encontrar mi respuesta. Muy nuevo en VBA y Python, pero muchos años con ArcGIS. Sé que puedo hacerlo de manera lenta con Seleccionar por atributos, pero lleva mucho tiempo.

Estoy intentando una unión espacial entre los casos de una enfermedad (capa de puntos) y las secciones del censo de EE. UU. (Capa de polígono). Esto requiere datos de conteo. Para cada punto / caso, tengo un campo llamado AÑO con rangos de fechas de 2001 a 2012, según el año en que ocurrió el caso. Necesito una columna de conteo para cada año. Por ejemplo, al primero al que llamo COUNT01. Si la fecha del caso en AÑO es 2001, entonces COUNT01 tendrá un 1. Si es cualquier otro año (2002-2012), entonces deberá haber un 0. Tendré COUNT02, COUNT03 ... COUNT12 columnas. No puede tener un valor "Nulo".

Esto es lo que he probado hasta ahora.

ingrese la descripción de la imagen aquí

Y así es como se ven los datos en Arc.

ingrese la descripción de la imagen aquí

BenW
fuente
3
Le recomiendo que haga esto usando Python y edite su Pregunta para reemplazar las etiquetas vbay vbscriptpor una pythonetiqueta. Aunque aún no ha desaparecido, VBScript está en proceso de desaprobación . Espero que sea fácil de hacer con el analizador Python una vez que proporcione una descripción más detallada que incluya una imagen / tabla de algunas filas de muestra que muestren la entrada real y la salida esperada. ¿AÑO es un campo de fecha o un campo entero que contiene valores correspondientes a años?
PolyGeo
Gracias por el consejo y ayuda. He agregado una imagen de la tabla de atributos. La variable de entrada AÑO se almacena actualmente como un Doble (se analizó a partir de una Fecha SAS), y la columna de variable de salida Counts01 se almacena como Entero corto.
BenW
1
¿Ha considerado usar Estadísticas resumidas con AÑO como su campo de caso? Eso debería darte el COUNT para cada año sin necesidad de usar Python o la Calculadora de campo.
PolyGeo
Gracias por su consejo. Sí consideré Estadísticas resumidas, pero el objetivo final es contar los casos anuales por cada 1,249 secciones censales individuales a partir de las cuales puedo calcular tasas de incidencia anuales y promedio de 10 años por 100k. Algunas secciones del censo no han tenido casos, algunas han tenido una tonelada, pero necesito que se incluyan todas. Incluso resumir tratados por año omite 278 de esos tratados sin casos.
BenW

Respuestas:

38

Creo que esto es lo que quieres ... usando Python puedes hacer lo siguiente (asume que los campos AÑO y COUNT0X son enteros)

  • Cambie a Python como se resalta a continuación.
  • Agregue el código al cuadro de entrada 'Pre Logic'
  • Cambie el valor del año según sea necesario para cada campo que calcule (Count01 usaría 2001, Count02 usaría 2002, etc.)

Tenga en cuenta que Python usa sangría para analizar el código, de modo que asegúrese de que el espaciado sea correcto.

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

esta

fader oscuro
fuente
3
@BenW: si esto resolvió su problema, márquelo como la respuesta (marque la casilla debajo del conteo de votos de respuesta).
Chad Cooper el
¿Qué hacer si quiero verificar un valor de cadena en la instrucción if que contiene letras acentuadas?
greyline
¿Qué hacer si los campos están en otro tipo, por ejemplo, texto, doble, etc.?
khaliff
@khaliff, podría insertar alguna función de conversión de tipo en el código de Python, por ejemplo if (int(year) == yearVal): , u otras (consulte: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
Gisnside
Gracias. ¿También tiene un enlace donde pueda encontrar cuándo usar myCalc, myFunc, Reclass, etc.?
khaliff
8

Esta respuesta es esencialmente la misma que se enumeró anteriormente, sin embargo, es una forma de no tener que usar el bloque de código ... para el campo Count01, establecería el analizador en Python y luego establecería su cálculo en

1 if !YEAR! == 2001 else 0

La forma en que esto se lee es: establezca el campo en 1 si el campo AÑO es 2001, si no es 2001, luego configúrelo en 0 ...

Si tiene múltiples condiciones if, puede anidar las segundas (y posteriores) condiciones "if" dentro de la instrucción else, como esta ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

La forma en que esto se lee es: establezca el campo en 1 si el campo AÑO es 2001, si no es 2001, luego configúrelo en 2 si es 2002, si no, luego configúrelo en 0 ...

Jason Miller
fuente
¿Cómo debo modificar este cálculo si tengo más de una condición, es decir, como si estuviéramos usando "elif"?
khaliff
Si tiene más de una condición, puede anidar la segunda (y posterior) condición "si" dentro de la declaración else ... para que pueda terminar con algo como esto ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller
6

Si va a utilizar VBScript, entonces su cálculo de campo se configuró incorrectamente. En primer lugar, no usaría una variable que sea el nombre del campo, esto es confuso, use un nombre diferente para que quede claro lo que estaba configurando. Su "endif" estaba equivocado, debería ser "end if" y su código debería haber estado en la sección de script pre-lógica. La forma correcta de configurar esto se muestra a continuación. Pero como han dicho los demás, trate de no usar VBScript ya que los ESRI están decididos a deshacerse de él en favor de Python.

Uso correcto de la calculadora de campo

Hornbydd
fuente
Muchas gracias por su ayuda. Terminé yendo con Python, ya que parece ser el consenso general.
BenW