Calcul du champ de date avec la date du jour à partir de datetime.date.today ()?


10

Je travaille sur une partie de l'outil qui utilisera arcpy.CalculateField_management pour ajouter la date actuelle à la table d'attribution. J'ai erré loin sur les interwebs et je n'arrive pas à trouver la solution à ce problème.

Lorsque j'utilise ce code, j'obtiens la valeur "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")

Lorsque j'utilise ce code, j'obtiens la valeur "19/06/1905" à partir de la date d'aujourd'hui du "10/07/2014"

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

Des pensées sur ce que je fais mal? Je voudrais éviter d'utiliser le curseur de mise à jour, mais je le ferai si c'est la dernière option.


Il semble que la partie Python de ce code fonctionne correctement aux intervalles de la date. Mais je pense que le problème vient de la partie Arcpy du code. Essayez "VB" au lieu de "PYTHON" et voyez si cela met à jour la valeur correcte dans le champ.
F_Kellner

Cela n'a pas résolu le problème, mais a eu le résultat étrange de changer la valeur affichée à 12:00:54 AM.
fathom analytics

Réponses:


10

Un curseur de mise à jour exécutera le calculateur de champ 100% du temps.

Vous devez écrire ceci comme une expression:

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 () ne fonctionnait pas dans la calculatrice de champ, basculé sur strftime.

OU, si vous voulez le faire de la meilleure façon où vous pouvez alimenter vos propres variables, utilisez un curseur:

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'

J'ai testé les deux et ils fonctionnent très bien. Merci! Sur une note latérale, je ne veux pas utiliser le curseur de mise à jour car il nécessite d'écrire plus pour quelque chose qui devrait être relativement simple. Il se peut que je sois nouveau sur python et que je ne comprenne pas l'utilité de la fonction. À première vue, l'utilisation d'un outil gp intégré est plus logique pour moi que l'utilisation du curseur. Pensées?
fathom analytics du

2
C'est parfaitement compréhensible. Moi aussi, je craignais les curseurs lorsque j'ai commencé avec Python. Cependant, à mesure que vous vous familiarisez avec Python, je pense que vous trouverez que les curseurs sont beaucoup plus flexibles. De plus, comme je l'ai mentionné dans ma réponse d'origine, les curseurs ont de bien meilleures performances. Dans le comté pour lequel je travaillais, un consultant SIG avait écrit un script pour un processus très long qui a utilisé le calculateur de terrain plusieurs fois et cela a pris plus de 2 heures à s'exécuter. Quand je me suis amélioré avec Python, j'ai réécrit le script et utilisé des curseurs au lieu du champ calc et il a fonctionné en moins de 15 minutes.
crmackey

0

Essayez d'utiliser:

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

Vous ne savez pas où modifier le code à l'aide de cette partie. Pouvez-vous modifier votre message pour afficher le code entier?
fathom analytics

cette ligne a été incorporée dans la réponse ci
detroit_hc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.