Передача тернарного оператора рекурсивно возвращает метод не поддерживает назначение элемента - PullRequest
1 голос
/ 09 июля 2019

У меня есть таблица ниже.Мне нужен код, чтобы рекурсивно рассчитать минимальную дату начала и найти диапазон дат между этой датой и конечной датой.Если диапазон <= 60, Cat должен увеличиваться на 1, иначе он должен оставаться равным -1.Проблема в том, что троичный оператор в функции def отказывается обновляться, потому что мой метод не назначает элемент в строке 62. </p>

OBJECTID_1 *    Conc *  ID  start   finish  DateRange   Cat
1   ASPELBJNMI  LAPMT   6/27/2018   8/11/2018   100 -1
2   ASPELBJNMI  KLKIY   8/22/2018   8/31/2018   100 -1
3   ASPELBJNMI  HDOKK   8/12/2018   9/30/2018   100 -1
4   ASPELBJNMI  XMCZW   8/22/2018   10/20/2018  100 -1
5   BKRKAVQTZC  FCBES   7/1/2018    8/15/2018   100 -1
6   BKRKAVQTZC  NHQGW   8/24/2018   9/4/2018    100 -1
7   BKRKAVQTZC  LVUSS   8/9/2018    10/4/2018   100 -1
8   BKRKAVQTZC  RQVNN   8/18/2018   10/24/2018  100 -1
9   FKKTHEJGCY  IHORM   7/2/2018    8/20/2018   100 -1
10  FKKTHEJGCY  AZFEV   8/28/2018   9/8/2018    100 -1
11  FKKTHEJGCY  YAVOY   8/4/2018    9/29/2018   100 -1
12  FKKTHEJGCY  AMWAX   8/16/2018   10/22/2018  100 -1
13  JUNRNEXCRG  QCOWV   6/30/2018   8/25/2018   100 -1
14  JUNRNEXCRG  AOYNL   8/25/2018   9/9/2018    100 -1
15  JUNRNEXCRG  CGCHK   8/4/2018    10/3/2018   100 -1
16  JUNRNEXCRG  IQYGJ   8/12/2018   10/26/2018  100 -1

Я пробовал различные методы, чтобы получить обновление строки.

Я попытался использовать понимание dict и назвать значение dict.Я также попытался сделать так, чтобы функция def включала генератор, список, кортеж и вызов значений рекурсивно.Результат тот же.

https://community.esri.com/message/861460-update-cursor-not-honoring-selection-in-a-for-loop

Мой код

import arcpy
from datetime import datetime
from datetime import datetime as dt
from datetime import timedelta
import time
from datetime import date
#Variables Start
arcpy.env.workspace = r'C:datap\New File Geodatabase.gdb'
fc= 'Classifyjoin212'
field =['Conc','ID']
fields = ['start', 'finish', 'DateRange', 'Cat']
Classifyjoin = "Classifyjoin"
Classifyjoin__2_ = Classifyjoin

#Def function

def min_cat(b=datetime.now() , m=datetime.now(), x = 2, y=-1):
"""This function calculates the date range between earliest start in a category to the exact finish date of an individual member"""""
#return(b-m).days
     lg =[2]
     e = (b-m).days
     f = {True: x, False: y} [e <= 60]#(y, x) [e <=60 ] # [ x if e<=60 else -1]
     return [ e, f]
#print min_cat(b=dt.strptime('2019-06-26', '%Y-%m-%d').date(),  m=dt.strptime('2018-11-29', '%Y-%m-%d').date(), x= 9, y=-1)

temp_lyr= arcpy.MakeTableView_management(fc, "temp_lyr")
ud = {}

with arcpy.da.SearchCursor(fc, field) as rows:
    for row in rows:
        if row[0] not in ud:
            ud[row[0]] = row[1]          
for k in ud:             
    where_clause="Conc IN( '%s')" % k #+ "AND ID IN( '%s')" %v
    #print(where_clause)
    Sele = arcpy.SelectLayerByAttribute_management(temp_lyr, 'NEW_SELECTION', where_clause)#Carry out the selection
    cnt = arcpy.GetCount_management(temp_lyr) # Counting the selected and copied features
    print("The number of selected records is: " + str(cnt))   
    listdates = []
    listCat =[]
    bv =[]
    #k = [row[3] for row in arcpy.da.SearchCursor(fc, ["start", "finish", "DateRange", "Cat"]) if row [2]<60]
    with arcpy.da.UpdateCursor(fc, fields) as cursor:

        for row in cursor:
            listCat.append(row[3])
            jp =max(listCat)
            kp = int('{}'.format(jp))
            kp +=1
                #while row[3]==0:
            if row[3]==-1:
                listdates.append(row[0])

                pg =min(listdates)#.date()
                jup = '{}'.format(pg)
                jop = dt.strptime(jup, '%Y-%m-%d %H:%M:%S').date()

                bg = '{}'.format(row[1])
                job = dt.strptime(bg, '%Y-%m-%d %H:%M:%S').date()
                a =min_cat(b= job, m=jop, x= kp, y=-1)
                row[2] = a[0]
                cursor.updateRow(row)
                rows[3] = a[1]
                cursor.updateRow(rows)               
    del cursor, row    

Желаемый результат:

OBJECTID_1 *    Conc *  ID  start   finish  DateRange   Cat
1   ASPELBJNMI  LAPMT   6/27/2018   8/11/2018   45  0
3   ASPELBJNMI  HDOKK   8/12/2018   9/30/2018   49  1
2   ASPELBJNMI  KLKIY   8/22/2018   8/31/2018   19  1
4   ASPELBJNMI  XMCZW   8/22/2018   10/20/2018  59  2
5   BKRKAVQTZC  FCBES   7/1/2018    8/15/2018   45  0
7   BKRKAVQTZC  LVUSS   8/9/2018    10/4/2018   56  1
8   BKRKAVQTZC  RQVNN   8/18/2018   10/24/2018  67  -1
6   BKRKAVQTZC  NHQGW   8/24/2018   9/4/2018    26  1
9   FKKTHEJGCY  IHORM   7/2/2018    8/20/2018   49  0
11  FKKTHEJGCY  YAVOY   8/4/2018    9/29/2018   56  1
12  FKKTHEJGCY  AMWAX   8/16/2018   10/22/2018  67  -1
10  FKKTHEJGCY  AZFEV   8/28/2018   9/8/2018    35  1
13  JUNRNEXCRG  QCOWV   6/30/2018   8/25/2018   56  0
15  JUNRNEXCRG  CGCHK   8/4/2018    10/3/2018   60  1
16  JUNRNEXCRG  IQYGJ   8/12/2018   10/26/2018  75  -1
14  JUNRNEXCRG  AOYNL   8/25/2018   9/9/2018    36  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...