使用CalculateField更新日期字段

时间:2017-09-05 19:15:30

标签: python vbscript arcgis arcpy

我正在ArcGIS中使用Arcpy并尝试编写将在上个月的最后一天更新字段的代码(即,如果我今天运行代码,2017-09-01,它将更新字段与2017-08-31)。

如果我进行手动字段计算,我可以使用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

1 个答案:

答案 0 :(得分:0)

您收到错误“在调用子时无法使用括号”。这是因为VBScript中函数调用的以下规则:

3在VBScript中调用函数的方法:

  • fn a,b - 使用这种方式时,不能将参数列表括在括号中
  • Call fn(a,b) - 当您明确编写call关键字时,必须将参数列表括在括号中
  • 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,因此写了这个答案。