python - 使用 CalculateField 更新带有日期的字段

标签 python vbscript arcgis arcpy

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

最佳答案

您收到错误消息“调用子程序时无法使用括号”。这是因为 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/

相关文章:

c# - 实现用于检测自相交多边形的蛮力算法

python - 在 Python Pandas 中,如何获取一列,然后跳过几列,然后获取连续的列

mysql - IIS 上的 ASP Classic 需要 31 秒来执行每个 mySQL 脚本

vbscript - 如何使用 VBScript 终止由特定用户启动的进程

powershell - Windows 产品 key - 来自不同技术的不同答案

google-maps-api-3 - api google 中的 Esri basemap

python - 将 .dbf 连接到 .shp - 然后计算字段脚本 - 错误处理,脚本在没有连接时退出

python - Apache Spark (PySpark) 在读取 CSV 时处理空值

python - pandas 的分类变量

python - 将数据从网络应用程序发送到 ipython 笔记本