Suite

Pourquoi arcpy.CalculateField_management() écrit-il 1899-12-30 00:00:00 au lieu de la date prévue ?

Pourquoi arcpy.CalculateField_management() écrit-il 1899-12-30 00:00:00 au lieu de la date prévue ?


J'utilise ArcGIS 10.3.1 for Desktop pour tester avant d'écrire une réponse à Saisie de la date avec arcpy.GetParameterAsText()? J'ai écrit le code de test ci-dessous que j'exécute sur une classe d'entités de test (testFC) avec quatre fonctionnalités de ligne pour essayer de mettre à jour sondateChampavec une valeur de date constante de "01.07.2015".

import arcpy dmyString = "01.07.2015" fc = r"C:	emp	est.gdb	estFC" item = "dateField" dmyDate = datetime.datetime.strptime(dmyString,'%d.%m.%Y') print dmyDate arcpy.CalculateField_management(fc,item,dmyDate,"PYTHON") avec arcpy.da.SearchCursor(fc,[item]) comme curseur : pour la ligne dans le curseur : imprimer la ligne[0]

Je pense que ce qui précède devrait fonctionner, et à partir de la sortie ci-dessous, vous pouvez voir que l'objet date (dmyDate) semble être bien créé, mais les valeurs écrites pour chacune des quatre fonctionnalités ne correspondent pas à ce à quoi je m'attendrais.

>>> ================================ REDÉMARRER ============== ================== >>> 01/07/2015 00:00:00 1899-12-30 00:00:00 1899-12-30 00:00: 00 1899-12-30 00:00:00 1899-12-30 00:00:00 >>>

Quelqu'un peut-il expliquer pourquoi1899-12-30 00:00:00est écrit au lieu de2015-07-01 00:00:00?

La table attributaire s'affiche comme ci-dessous :

Si je remplace la ligne CalculateField ci-dessus par :

arcpy.CalculateField_management(fc,item,"date '2015-07-01 00:00:00'","PYTHON")

ou alors

arcpy.CalculateField_management(fc,item,"date '2015/07/01 00:00:00'","PYTHON")

selon les commentaires de @Vince, je reçois une erreur :

Traceback (appel le plus récent en dernier) : Fichier "C:	emp	est.py", ligne 11, dans  arcpy.CalculateField_management(fc,item,"date '2015-07-01 00:00:00'","PYTHON") Fichier "C:Program Files (x86)ArcGISDesktop10.3ArcPyarcpymanagement .py", ligne 3457, dans CalculateField raise e ExecuteError: ERROR 000539: SyntaxError: syntaxe invalide (, ligne 1) Échec de l'exécution (CalculateField).

Le code ci-dessous montre comment faire fonctionner cela en utilisant un code très similaire à celui de la question, mais je recommande également de revoir l'explication détaillée qui suit afin de comprendre pourquoi cela fonctionne :

import arcpy dmyString = "01.07.2015" d,m,Y = dmyString.split(".") dmyDate = datetime.datetime(int(Y),int(m),int(d)) epoch = datetime.datetime( 1899, 12, 30) jours = (dmyDate - epoch).days fc = r"C:	emp	est.gdb	estFC" item = "dateField" print dmyDate arcpy.CalculateField_management(fc,item,days,"PYTHON" ) print "
Output :" avec arcpy.da.SearchCursor(fc,[item]) comme curseur : pour la ligne dans le curseur : imprimer la ligne[0]

produit :

>>> ================================ REDÉMARRER ============== ================== >>> 01-07-2015 00:00:00 Sortie: 01-07-2015 00:00:00 01-07-2015 00: 00:00 2015-07-01 00:00:00 2015-07-01 00:00:00 >>>

Ne soyez pas dérangé de voir 1/07/2015 (au lieu de 7/01/2015) ci-dessus - les paramètres Windows de PolyGeo sont pour l'Australie où ils ont tendance à utiliser jj/mm/AAAA.

Pourquoi ça marche :

D'accord, donc CalculateField attend le nombre de jours depuis l'époque (1899-12-30 comme l'a souligné @Vince) alors qu'UpdateCursor accepte soit un objet datetime.datetime(), soit des jours delta.

import arcpy, time arcpy.env.workspace = r"C:UsersPaulDesktop	esting.gdb" def compare(calc, cursor): #Créer de nouveaux champs arcpy.DeleteField_management("dater", ["date1", "date2"]) arcpy.AddField_management("dater", "date1", "DATE") arcpy.AddField_management("dater", "date2", "DATE") #Essayons CalcField arcpy.CalculateField_management("dater", " date1", calc, "PYTHON") #Et maintenant Ucursor avec arcpy.da.UpdateCursor("dater", ["date2"]) comme lignes : pour la ligne dans les lignes : rows.updateRow([cursor]) #Prenons un regardez… avec arcpy.da.SearchCursor("dater", ["date1", "date2"]) comme lignes : pour la ligne dans les lignes : print("Calc:	{}	Ucursor:	{}".format (*row)) date1 = datetime.datetime(2015, 7, 10) #Jours depuis l'époque epoch = datetime.datetime (1899, 12, 30) jours = (date1 - epoch).days print("Datetime aux deux : 
") compare(date1, date1) print("
Delta jours à calculer, datetime à Ucursor :
") compare(jours, date1) print("
Delta jours aux deux : :
") compare(jours , journées)

Le résultat:

Datetime aux deux : Calc : 1899-12-30 00:00:00 Ucursor : 2015-07-10 00:00:00 Calc : 1899-12-30 00:00:00 Ucursor : 2015-07-10 00:00 :00 Calc: 1899-12-30 00:00:00 Ucursor: 2015-07-10 00:00:00 Delta jours à calculer, datetime à Ucursor: Calc: 2015-07-10 00:00:00 Ucursor: 2015 -07-10 00:00:00 Calc: 2015-07-10 00:00:00 Ucurseur: 2015-07-10 00:00:00 Calc: 2015-07-10 00:00:00 Ucurseur: 2015-07 -10 00:00:00 Delta jours vers les deux : : Calc : 2015-07-10 00:00:00 Ucurseur : 2015-07-10 00:00:00 Calc : 2015-07-10 00:00:00 Ucurseur : 2015-07-10 00:00:00 Calc: 2015-07-10 00:00:00 Ucurseur: 2015-07-10 00:00:00

Des trucs très intéressants ! De toute évidence, les curseurs sont le choix préféré lorsqu'il s'agit de dates. Cela ou leVBScriptanalyseur pour FieldCalc.


Voir la vidéo: Date and Time Field Calculations in Arcmap