datetime.date.today()から今日の日付で日付フィールドを計算していますか?


10

arcpy.CalculateField_managementを使用して現在の日付を属性テーブルに追加するツールの一部に取り組んでいます。私はインターウェブをずっとさまよいましたが、この問題の解決策を見つけることができません。

このコードを使用すると、「12:00:00 AM」という値が返されます

    input = r'C:\GIS\CARGIS\SHAPES.gdb\CRASH_ON_2013'
    today = datetime.date.today()
    dte = today.strftime('%m/%d/%Y')
    arcpy.CalculateField_management(input,"DTCARXTRCT",dte,"PYTHON")

このコードを使用すると、今日の日付「10/07/2014」から値「06/19/1905」を取得します

    input = r'C:\GIS\CARGIS\SHAPES.gdb\CRASH_ON_2013'
    today = datetime.date.today()
    dte = str(today)
    arcpy.CalculateField_management(input,"DTCARXTRCT",dte,"PYTHON")

私が間違っていることについて何か考えはありますか?更新カーソルの使用を避けたいのですが、それが最後のオプションであればそうします。


このコードのPython部分は、日付の途中で正しく機能しているようです。しかし、問題はコードのArcpy部分にあると思います。「PYTHON」の代わりに「VB」を試して、それがフィールドの正しい値を更新するかどうかを確認してください。
F_Kellner 2014年

これは問題を解決しませんでしたが、表示された値を12:00:54 AMに変更するという奇妙な結果がありました。
ファゾム分析

回答:


10

更新カーソルは、フィールド計算機を100%実行します。

これを式として書く必要があります:

import arcpy, datetime

fc = r'C:\GIS\CARGIS\SHAPES.gdb\CRASH_ON_2013'
field = "DTCARXTRCT"
exp = '''def add_date():
  import time
  return time.strftime("%Y/%m/%d")'''

arcpy.CalculateField_management(fc, field, 'add_date()',
                                'PYTHON', exp)
print 'done'

datetime.date.today()はフィールド計算機では機能せず、strftimeに切り替えました。

または、独自の変数をフィードできるより良い方法で実行したい場合は、カーソルを使用します。

import arcpy, datetime

fc = r'C:\GIS\CARGIS\SHAPES.gdb\CRASH_ON_2013'
field = "DTCARXTRCT"
with arcpy.da.UpdateCursor(fc, [field]) as rows:
    for row in rows:
        rows.updateRow([datetime.date.today()])
print 'done'

私はこれらの両方をテストしました、そしてそれらは素晴らしい働きをします。ありがとう!余談ですが、更新カーソルを使用したくないのは、比較的単純なものにさらに書き込む必要があるためです。私はpythonが初めてで、関数の有用性を理解していない可能性があります。一見すると、パッケージ化されたgpツールを使用する方が、カーソルを使用するよりも理にかなっています。考え?
ファゾム分析

2
それは完全に理解できます。最初にPythonを使い始めたときも、カーソルを恐れていました。ただし、Pythonに慣れるにつれて、カーソルの柔軟性が大幅に高まると思います。また、最初の回答で述べたように、カーソルのパフォーマンスははるかに優れています。私が働いていた郡では、GISコンサルタントが、フィールド計算機を何度も使用する非常に長いプロセスのスクリプトを書いており、実行に2時間以上かかりました。Pythonが良くなったとき、スクリプトを書き直してフィールドcalcの代わりにカーソルを使用したところ、15分未満で実行されました。
crmackey 2014年

0

使ってみてください:

time.strftime("%Y/%m/%d")

この部分を使用してコードを変更する場所がわからない。コード全体を表示するように投稿を編集できますか?
ファゾム分析

この行は上記の回答に組み込まれています
detroit_hc 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.