使用CalculateField更新日期字段
问题描述:
我正在使用ArcGIS中的ArcGIS,并试图编写代码来更新上个月的最后一天的字段(即,如果我今天运行代码,2017-09- 01,它将在2017-08-31更新该字段)。使用CalculateField更新日期字段
如果我做了人工场计算,我可以得到它使用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中的函数调用的规则如下:
-
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,因此写了这个答案。
你可以发布你正在得到什么错误? – Akash
查看更新后的帖子 - 我添加了一张图片。 – AmandaNicole