2017-09-05 110 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,因此写了这个答案。