Daha çox

Arcpy.CalculateField_management () niyə gözlənilən tarix əvəzinə 1899-12-30 00:00:00 yazır?


Arcpy.GetParameterAsText () ilə tarixin daxil edilməsinə cavab yazmadan əvvəl test etmək üçün Masaüstü üçün ArcGIS 10.3.1 istifadə edirəm? Test kodunu aşağıda yazdım ki, bir test xüsusiyyət sinifinə qarşı işləyirəm (testFC) onu sınamaq və yeniləmək üçün dörd xətt xüsusiyyətləri ilətarix sahəsi"01.07.2015" sabit tarix dəyəri ilə.

import arcpy dmyString = "01.07.2015" fc = r "C:  temp  test.gdb  testFC" item = "dateField" dmyDate = datetime.datetime.strptime (dmyString, '% d.% m.% Y') dmyDate arcpy.CalculateField_management (fc, item, dmyDate, "PYTHON") arcpy.da.SearchCursor (fc, [item]) ilə kursor kimi çap edin: kursorda sıra üçün: çap sətri [0]

Düşünürəm ki, yuxarıda göstərilənlər işləməlidir və aşağıdakı çıxışdan tarix obyektinin olduğunu görə bilərsiniz (dmyDate) gözəl görünür, amma dörd xüsusiyyətin hər birinə yazılan dəyərlər gözlədiyim kimi deyil.

>>> ================================= yenidən başladın ============== ================== >>> 2015-07-01 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 >>>

Kimsə bunun səbəbini izah edə bilərmi?1899-12-30 00:00:00əvəzinə yazılır2015-07-01 00:00:00?

Atribut cədvəli aşağıdakı kimi göstərilir:

Yuxarıdakı CalculateField sətirini aşağıdakılarla əvəz edərəm:

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

və ya

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

@ Vince şərhlərinə görə bir səhv alıram:

Traceback (son zəng son): "C:  temp  test.py" faylı, sətir 11, içəridə  arcpy.CalculateField_management (fc, item, "date '2015-07-01 00:00:00'", "PYTHON") "C:  Program Files (x86)  ArcGIS  Desktop10.3  ArcPy  arcpy  management .py ", sətir 3457, CalculateField oshirish e ExecuteError: ERROR 000539: SyntaxError: yanlış sintaksis (, sətir 1) İcra edilmədi (CalculateField).

Aşağıdakı kod, sualdakılara çox bənzər bir kod istifadə edərək bunun necə işə salınacağını nümayiş etdirir, amma bunun nə üçün işlədiyini anlamaq üçün aşağıdakı ətraflı izahı nəzərdən keçirməyinizi məsləhət görürəm:

idxal 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) gün = (dmyDate - dövr) .günlər fc = r "C:  temp  test.gdb  testFC" item = "dateField" print dmyDate arcpy.CalculateField_management (fc, item, days, "PYTHON" ) " nÇıxış:" yazısını arcpy.da.SearchCursor (fc, [item]) ilə kursor kimi yazdırın: kursorda satır üçün: print sıra [0]

istehsal edir:

>>> ================================= Yenidən başladın ============== ================== >>> 2015-07-01 00:00:00 Çıxış: 2015-07-01 00:00:00 2015-07-01 00: 00:00 2015-07-01 00:00:00 2015-07-01 00:00:00 >>>

Yuxarıda 07.07.2015 (7/01/2015 yerinə) gördüyünüzdən narahat olmayın - PolyGeo-nun Windows ayarları dd / mm / YYYY istifadə etməyə meylli olduqları Avstraliya üçündür.

Niyə işləyir:

Tamam, buna görə CalculateField dövrdən bəri bir neçə gün gözləyir (@Vince qeyd etdiyi kimi 1899-12-30), UpdateCursor isə bir datetime.datetime () obyektini və ya delta günlərini qəbul edir.

import arcpy, time arcpy.env.workspace = r "C:  Users  Paul  Desktop  testing.gdb" def müqayisə (calc, imleç): #Yeni sahələr yaradın arcpy.DeleteField_management ("dater", ["date1", "date2"]) arcpy.AddField_management ("dater", "date1", "DATE") arcpy.AddField_management ("dater", "date2", "DATE") # CalcField arcpy.CalculateField_management ("dater", " date1 ", calc," PYTHON ") # Və indi Ucursor arcpy.da.UpdateCursor (" dater ", [" date2 "]) ilə satır şəklində: satır sıra üçün: rows.updateRow ([kursor]) # Gəlin arcpy.da.SearchCursor ilə ("dater", ["date1", "date2"]) sıralar kimi baxın: satır sıraları üçün: çap ("Calc:  t {}  tUcursor:  t {}" format. (* sıra)) date1 = datetime.datetime (2015, 7, 10) # Dövrdən bəri günlər = datetime.datetime (1899, 12, 30) gün = (date1 - epoch) .days print ("Datetime for both:  n ") müqayisə et (tarix1, tarix1) çap et ("  nDelta gün hesablanır, datetime Ucursor-a:  n ") müqayisə et (günlər, tarix1) çap ("  nDelta günlər hər ikisinə ::  n ") müqayisə et (günlər , gün)

Nəticə:

Hər ikisinə tarix: 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 Hesaplama: 1899-12-30 00:00:00 Ucursor: 2015-07-10 00:00:00 Delta günləri hesablanır, datetime Ucursor'a: Calc: 2015-07-10 00:00:00 Ucursor: 2015 -07-10 00:00:00 Hesablama: 2015-07-10 00:00:00 Ucursor: 2015-07-10 00:00:00 Calc: 2015-07-10 00:00:00 Ucursor: 2015-07 -10 00:00:00 İkisinə də delta günləri :: Calc: 2015-07-10 00:00:00 Ucursor: 2015-07-10 00:00:00 Calc: 2015-07-10 00:00:00 Ucursor : 2015-07-10 00:00:00 Hesaplama: 2015-07-10 00:00:00 Ucursor: 2015-07-10 00:00:00

Çox maraqlı şeylər! Aydındır ki, tarixlərlə işləyərkən seçilən seçim imleclərdir. O ya daVBScriptFieldCalc üçün ayrıştırıcı.


Videoya baxın: ArcGIS Pro: Using Python in Field Calculators Code Block to Average Across Field Values (Oktyabr 2021).