Grundlegendes If / Then in Python Parser von ArcGIS Field Calculator?


18

Ich verwende ArcGIS 10.2 für Desktop, habe diese Site durchsucht und kann meine Antwort noch nicht herausfinden. Sehr neu für VBA und Python, aber viele Jahre mit ArcGIS. Ich weiß, dass ich dies mit "Nach Attributen auswählen" langsam tun kann, aber es ist zeitaufwändig.

Ich versuche eine räumliche Verbindung zwischen Krankheitsfällen (Punkteschicht) und US-Volkszählungsgebieten (Polygonschicht). Dies erfordert Zähldaten. Für jeden Punkt / Fall habe ich ein Feld mit der Bezeichnung JAHR mit Datumsbereichen 2001 bis 2012, je nachdem, in welchem ​​Jahr der Fall eingetreten ist. Ich brauche eine Zählspalte für jedes Jahr. Zum Beispiel die erste, die ich COUNT01 anrufe. Wenn das Falldatum in YEAR 2001 ist, enthält COUNT01 eine 1. Wenn es sich um ein anderes Jahr (2002-2012) handelt, muss es eine 0 geben. Ich habe COUNT02, COUNT03 ... COUNT12 Spalten. Kann keinen "Null" -Wert haben.

Folgendes habe ich bisher versucht

Bildbeschreibung hier eingeben

Und so sehen die Daten in Arc aus.

Bildbeschreibung hier eingeben


3
Ich empfehle Ihnen, dies mit Python zu tun und Ihre Frage zu bearbeiten, um die Tags vbaund vbscriptdurch ein pythonTag zu ersetzen . Obwohl VBScript noch nicht entfernt wurde, wird es derzeit nicht mehr weiterentwickelt . Ich gehe davon aus, dass es mit dem Python-Parser einfach sein wird, wenn Sie eine detailliertere Beschreibung bereitstellen, die ein Bild / eine Tabelle einiger Beispielzeilen enthält, die die tatsächliche Eingabe und die erwartete Ausgabe zeigen. Ist YEAR ein Datumsfeld oder ein ganzzahliges Feld, das Werte enthält, die Jahren entsprechen?
PolyGeo

Danke für den Rat und die Hilfe. Ich habe ein Bild der Attributtabelle hinzugefügt. Die YEAR-Eingabevariable wird derzeit als Double gespeichert (sie wurde aus einem SAS-Datum analysiert), und die Ausgabevariablenspalte Counts01 wird als Short Integer gespeichert.
BenW

1
Haben Sie darüber nachgedacht, Summary Statistics with YEAR als Ihr Fallfeld zu verwenden? Das sollte Ihnen den COUNT für jedes Jahr geben, ohne dass Sie Python oder den Field Calculator verwenden müssen.
PolyGeo

Danke für deinen Rat. Ich habe eine zusammenfassende Statistik in Betracht gezogen, aber das endgültige Ziel ist es, jährliche Fallzahlen pro 1.249 einzelnen Zensus-Traktaten zu erhalten, aus denen ich die jährliche und die 10-jährige durchschnittliche Inzidenzrate pro 100.000 berechnen kann. Einige Zensus-Traktate hatten keine Fälle, einige hatten eine Tonne, aber ich brauche sie alle, um aufgenommen zu werden. Selbst wenn man Traktate nach Jahr zusammenfasst, bleiben 278 dieser Traktate ohne Fälle aus.
BenW

Antworten:


38

Ich denke, das ist, was Sie wollen ... mit Python können Sie Folgendes tun (vorausgesetzt, YEAR- und COUNT0X-Felder sind ganze Zahlen)

  • Wechseln Sie zu Python, wie unten hervorgehoben
  • Fügen Sie den Code in das Eingabefeld 'Pre Logic' ein
  • Ändern Sie den yearVal nach Bedarf für jedes von Ihnen berechnete Feld (Count01 würde 2001 verwenden, Count02 würde 2002 verwenden usw.).

Hinweis Python verwendet Einrückungen, um den Code zu analysieren. Stellen Sie daher sicher, dass der Abstand korrekt ist.

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

Dies


3
@BenW - Wenn dies Ihr Problem gelöst hat, markieren Sie dies bitte als Antwort (Kontrollkästchen unter der Anzahl der abgegebenen Stimmen).
Chad Cooper

Was kann ich tun, wenn ich in der if-Anweisung einen Zeichenfolgewert überprüfen möchte, der akzentuierte Buchstaben enthält?
Greyline

Was tun, wenn sich die Felder in einem anderen Typ befinden, z. B. Text, Double usw.?
Khaliff

@khaliff Sie könnten beispielsweise eine Typkonvertierungsfunktion in den Python-Code einfügen if (int(year) == yearVal): oder andere (siehe: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
Gisnside

Vielen Dank. Haben Sie auch einen Link, über den ich erfahren kann, wann ich myCalc, myFunc, Reclass usw. verwenden soll?
Khaliff

8

Diese Antwort ist im Wesentlichen dieselbe wie die oben aufgeführte, es ist jedoch eine Möglichkeit, den Codeblock nicht verwenden zu müssen. Für das Feld Count01 würden Sie den Parser auf Python setzen und dann Ihre Berechnung auf

1 if !YEAR! == 2001 else 0

Dies lautet folgendermaßen: Setzen Sie das Feld auf 1, wenn das YEAR-Feld 2001 ist, und, wenn es nicht 2001 ist, setzen Sie es auf 0 ...

Wenn Sie mehrere if-Bedingungen haben, können Sie die 2. (und nachfolgende) "if" -Bedingungen in die else-Anweisung einbetten, z. B. diese ...

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

Dies lautet folgendermaßen: Setzen Sie das Feld auf 1, wenn das YEAR-Feld 2001 ist, wenn es nicht 2001 ist, setzen Sie es auf 2, wenn es 2002 ist, wenn nicht, setzen Sie es auf 0 ...


Wie soll ich diese Berechnung ändern, wenn ich mehr als eine Bedingung habe, ich meine, als ob wir "elif" verwenden?
Khaliff

Wenn Sie mehr als eine Bedingung haben, können Sie die 2. (und nachfolgende) "if" -Bedingung in die else-Anweisung schachteln. So könnte es sein, dass Sie folgendes 1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller

6

Wenn Sie VBScript verwenden, wurde Ihre Feldberechnung falsch eingestellt. Erstens würde ich keine Variable verwenden, die der Name des Feldes ist. Dies ist verwirrend. Verwenden Sie einen anderen Namen, damit klar ist, was Sie eingestellt haben. Ihr "endif" war falsch, es sollte "end if" sein und Ihr Code sollte sich im Abschnitt mit den vorlogischen Skripten befinden. Die richtige Art und Weise, dies einzurichten, ist unten gezeigt. Aber wie die anderen bereits gesagt haben, versuchen Sie, VBScript nicht zu verwenden, da ESRI nur darauf aus ist, es zugunsten von Python zu entfernen.

Richtige Verwendung des Feldrechners


Vielen Dank für Ihre Hilfe. Am Ende habe ich mich für Python entschieden, da dies der allgemeine Konsens zu sein scheint.
BenW
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.