我正在ArcGIS中使用Arcpy并尝试编写将在上个月的最后一天更新字段的代码(即,如果我今天运行代码,2017-09-01,它将更新字段与2017-08-31)。
如果我进行手动字段计算,我可以使用VBScript和预逻辑脚本代码使其工作:
Dim FC
FC = DateSerial(Year(Date), Month(Date), 0)
然后将字段设置为等于FC:
我已经尝试将其集成到代码中,因此可以设置为自动运行,但没有任何运气。是否有人能够通过以下代码确定我出错的地方?
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)
我收到以下错误消息:
答案 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,因此写了这个答案。