如何在计算期间以及基于该计算的先前结果更新Excel中的值?

时间:2019-02-22 14:55:26

标签: python excel python-2.7 arcmap

我正在研究一个模型来匹配供需关系。对模型的简短解释:我有几个带有一定资源单位的“供应”点和几个“需求”点。目的是通过最小化运输距离,将可用资源从“供应”点“释放”到最接近的“需求”点。

在ArcGIS中,我已经找到了与每个“供应”点最接近的“需求”点,并具有相应的距离。此外,我还有在“供应”点产生的大量资源和在“需求”点所需的资源。我将结果存储在Excel表中,并按从小到大的距离对它们进行了排序,以便可以使用Python进一步处理它们。

我制作了一个带有简单概述的表格,其中有2个“供应”点和几个“需求”点。 “供应”点1处的可用资源为10,而“供应”点2处的可用资源为20。所有“需求”点的需求都不同。 The Excel table looks like this:

使用该Excel表,我想计算从每个“供应”点('D')到最接近(和第二最接近…n最接近)“需求”点('E')可以提供多少单位的资源),直到“供应”点中的值是0 /已完全分配。我想在“附加”列('F')中存储从“供应”到“需求”的运输量的值 为此,我编写了以下代码:

for row in range(1,sheet.max_row+1):
   if sheet['D'+str(row)].value !=0 and sheet['E'+str(row)].value !=0:
    for row in range(1,sheet.max_row+1):
        if sheet['D'+str(row)].value > sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['E'+str(row)].value
            sheet['D'+str(row)].value = sheet['D'+str(row)].value - sheet['E'+str(row)].value
            sheet['E'+str(row)].value = 0
        if sheet['D'+str(row)].value < sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['D'+str(row)].value
            sheet['E'+str(row)].value = sheet['E'+str(row)].value -sheet['D'+str(row)].value
            sheet['D'+str(row)].value = 0
        if sheet['D'+str(row)].value == sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['E'+str(row)].value
            sheet['D'+str(row)].value = 0
            sheet['E'+str(row)].value = 0

上面的代码可以工作并计算列表中所有行中F列中所需的所有值。

但是,仍然存在一个问题:

现在编写代码的方式无法正确更新供求的值。因此,没有考虑到,如果从一个“供应”点到“需求”点提供了一些资源,则“供应”单元中的可用资源量会发生变化,以进行以后的计算。

更具体地说,“供应”点1仅具有10个可用的单位,可以“分配”。在下面的示例表中,“供应”点1只能向第一和第二最接近的“需求”点供应资源,直到“供应”点1的所有资源用完(DEMAND_FID = 10的“需求点”为6个单位)和4个单位到“需求点” DEMAND_FID = 11)。之后,“供应”点1(SUPPLY_R)的所有单元都“消失”,满足DEMAND_FID = 10的“需求点”的需求,并将DEMAND_FID = 11的“需求点”的需求从6减少到1。因此,甚至不应计算第6行,因为“供应”点1无法向“需求点”提供任何其他资源 因此,我想在计算完一行后更新SUPPLY_R和DEMAND_R的值。

The “ideal” table with results should look like this:

如何解决基于计算中的前一行在一行中更改一个值的问题?

我试图用字典中的值更新新的“ supply”和“ demand”值,但这无法提供所需的结果。

1 个答案:

答案 0 :(得分:1)

我实际上已经解决了这个问题。 我正在使用字典来更新每行中的值 (很抱歉,列的编号现在不同了,但是希望该方法变得清晰起来)

dict1={1: 156, 2: 5, 3: 207, ....., 226: 142}
dict2={{1: 23, 2: 18, 3: 23,....., 1530: 9}

for row in range(2,sheet.max_row+1):
   sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value] 
   sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]

   if sheet['F'+str(row)].value > sheet['I'+str(row)].value:
          sheet['L'+str(row)].value = sheet['I'+str(row)].value 
          if sheet['L'+str(row)].value <= 0:
                sheet['L'+str(row)].value = None
          sheet['F'+str(row)].value = sheet['F'+str(row)].value -sheet['I'+str(row)].value
          sheet['I'+str(row)].value = 0
          if sheet['L'+str(row)].value > 0:
                sheet['M'+str(row)].value = sheet['C'+str(row)].value
          else:
                sheet['M'+str(row)].value = None
          if sheet['L'+str(row)].value > 0:
                sheet['N'+str(row)].value = sheet['D'+str(row)].value
          else:
                sheet['N'+str(row)].value = None

      #2 different methods to update the dictionary
          dict1_1={sheet['C'+str(row)].value :sheet['F'+str(row)].value}
          dict1.update(dict1_1)
          sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value]
          dict2[sheet['D'+str(row)].value]= sheet['I'+str(row)].value
          sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]