【问题标题】:Using CalculateField to update field with date使用 CalculateField 更新字段的日期
【发布时间】:2018-02-14 03:47:06
【问题描述】:

我在 ArcGIS 中使用 Arcpy 并尝试编写代码来更新上个月最后一天的字段(即,如果我今天运行代码,2017-09-01,它将更新字段与 2017 年 8 月 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)

我收到以下错误消息:

【问题讨论】:

  • 你能发布你遇到的错误吗?
  • 查看更新后的帖子 - 我添加了一张图片。

标签: python vbscript arcgis arcpy


【解决方案1】:

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

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

  • 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 特有的,因此写了这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2021-06-23
    • 2017-11-29
    相关资源
    最近更新 更多