我在 ArcGIS 中使用 Arcpy 并尝试编写代码来更新上个月最后一天的字段(即,如果我今天运行代码,2017 年 9 月 1 日,它将更新该字段与 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)
我收到以下错误消息:
最佳答案
您收到错误消息“调用子程序时无法使用括号”。这是因为 VBScript 中的函数调用遵循以下规则:
3 种在 VBScript 中调用函数的方法:
fn a,b
- 使用这种方式时,您不能将参数列表括在括号中Call fn(a,b)
- 当您显式编写 call 关键字时,必须将参数列表括在括号中c=fn(a,b)
- 将函数返回的值赋给变量时,必须将参数列表括在括号中。
要更好地了解这些规则,请查看此 answer .
您的情况发生了什么:
在您发布的 VBScript 代码中,您使用了第三种方法并遵循了将参数列表括在括号内的规则。因此,它运行良好。
在 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,因此写了这个答案。
关于python - 使用 CalculateField 更新带有日期的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46061886/