2017-09-05 88 views
3

我正在使用ArcGIS中的ArcGIS,並試圖編寫代碼來更新上個月的最後一天的字段(即,如果我今天運行代碼,2017-09- 01,它將在2017-08-31更新該字段)。使用CalculateField更新日期字段

如果我做了人工場計算,我可以得到它使用VBScript和預邏輯腳本代碼的工作:

Dim FC 
FC = DateSerial(Year(Date), Month(Date), 0) 

然後將該字段設置爲等於FC:

see image here

我試圖將它集成到代碼中,以便它可以設置爲自動運行,但沒有任何運氣。任何人都可以通過下面的代碼識別出錯的地方嗎?

import arcpy 

inTable = r'C:\1 Block Watch Cr\Base_Data.gdb\Districts' 
field = "Final_Date" 
exp = 'getdate()' 
codeblock = '''def getdate(): 
    DateSerial(Year(Date()), Month(Date()), 0)''' 

arcpy.CalculateField_management(inTable, field, exp, "VB", codeblock) 

我收到以下錯誤消息:

screenshot of error message

+0

你可以發佈你正在得到什麼錯誤? – Akash

+0

查看更新後的帖子 - 我添加了一張圖片。 – AmandaNicole

回答

0

你所得到的錯誤「而調用子不能使用括號」。這是因爲在VBScript中的函數調用的規則如下:

  • fn a,b - 使用這種方式時,就不能封閉參數列表:調用VBScript中的函數的

    3種方法括號

  • Call fn(a,b) - 當你寫的通話關鍵字明確,則必須將參數列表中的括號
  • c=fn(a,b) - 當您指定由函數返回一個變量的值,則必須用個括號中的參數列表。

要更好地瞭解這些規則,請檢查此answer

你的情況發生了什麼事:

在您發佈的VBScript代碼,您使用的第3方法,並隨後包圍在括號內的參數列表中選擇規則。因此,它運行良好。

在Python代碼中,您只需使用DateSerial(Year(Date()), Month(Date()), 0)這是第一種方法。根據第一種方法的規則,您不能將參數列表括在括號中。既然你把括號內的參數列表括起來了,你就違反了這個規則並得到了那個錯誤。

可能的解決方案:

要麼使用呼叫方法1正確地去除括號如下:

codeblock = '''def getdate(): 
    DateSerial Year(Date()), Month(Date()), 0''' 

或明確實際調用函數之前寫call關鍵字:

codeblock = '''def getdate(): 
    Call DateSerial(Year(Date()), Month(Date()), 0)''' 

或嘗試將結果日期存儲在變量中,如下所示:

codeblock = '''def getdate(): 
    varDate = DateSerial(Year(Date()), Month(Date()), 0)''' 

請注意,我不知道python。所以,我假設你寫的任何python代碼都是正確的。這個錯誤是特定於VBScript,因此寫了這個答案。