Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在计算过程中根据以前的计算结果更新Excel中的值?_Python_Excel_Python 2.7_Arcmap - Fatal编程技术网

Python 如何在计算过程中根据以前的计算结果更新Excel中的值?

Python 如何在计算过程中根据以前的计算结果更新Excel中的值?,python,excel,python-2.7,arcmap,Python,Excel,Python 2.7,Arcmap,我正在研究一个模型,以满足供求关系。对模型的一个简短解释是:我有几个“供应”点,其中有一个单位的资源和几个“需求”点。目的是通过最小化运输距离,将可用资源从“供应”点“排放”到最近的“需求”点 在ArcGIS中,我已经找到了距离每个“供应”点最近的“需求”点以及相应的距离。此外,我有在“供应”点生产的资源量和在“需求”点需要的资源量。我将结果存储在Excel表格中,并按从小到大的距离对它们进行排序,以便使用Python进一步处理它们 我做了一个简单概述的表格,其中我有两个“供应”点和几个“需求”

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

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

我做了一个简单概述的表格,其中我有两个“供应”点和几个“需求”点。“供应”点1的可用资源为10,“供应”点2的可用资源为20。所有“需求”点的需求各不相同。

有了这个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
适用于范围内的行(第1页,最大行+1):
如果工作表[D'+str(行)]。值=0和表['E'+str(行)]。值=0:
对于范围内的行(1,最大工作表行+1):
如果工作表['D'+str(行)]。值>工作表['E'+str(行)]。值:
工作表['F'+str(行)]。值=工作表['E'+str(行)]。值
工作表['D'+str(行)]。值=工作表['D'+str(行)]。值-工作表['E'+str(行)]。值
表[E'+str(行)]。值=0
如果工作表['D'+str(行)]。值<工作表['E'+str(行)]。值:
工作表['F'+str(行)]。值=工作表['D'+str(行)]。值
工作表['E'+str(行)]。值=工作表['E'+str(行)]。值-工作表['D'+str(行)]。值
表['D'+str(行)]。值=0
如果工作表['D'+str(行)]。值==工作表['E'+str(行)]。值:
工作表['F'+str(行)]。值=工作表['E'+str(行)]。值
表['D'+str(行)]。值=0
表[E'+str(行)]。值=0
上面的代码工作并计算列表长度上所有行的F列中所需的所有值

然而,仍然存在一个问题:

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

更具体地说,“供应”点1只有10个可供“分配”的装置。在下表示例中,“供应”点1只能向第一个和第二个最近的“需求”点供应资源,直到“供应”点1的所有资源用完(6个单元到“需求点”,需求FID=10,4个单元到“需求点”需求FID=11)。之后,“供应”点1(供应)的所有单元都“消失”,需求FID=10的“需求点”的需求得到满足,需求FID=11的“需求点”的需求从6减少到1。因此,甚至不应计算第6行,因为“供应”点1无法向“需求点”提供任何额外资源 因此,我想在计算完一行后更新SUPPLY\u R和DEMAND\u R的值

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


我试图用字典中的值更新新的“供应”和“需求”值,但这并没有给出期望的结果

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

dict1={1:156,2:5,3:207,…,226:142}
dict2={{1:23,2:18,3:23,…,1530:9}
对于范围内的行(2,最大工作表行+1):
工作表['F'+str(行)]。数值=dict1[工作表['C'+str(行)]。数值]
表[I'+str(行)]。值=dict2[表[D'+str(行)]。值]
如果工作表['F'+str(行)]。值>工作表['I'+str(行)]。值:
工作表['L'+str(行)]。值=工作表['I'+str(行)]。值
如果工作表['L'+str(行)]。值为0:
表['M'+str(行)]。值=表['C'+str(行)]。值
其他:
表['M'+str(行)]。值=无
如果工作表['L'+str(行)]。值大于0:
工作表['N'+str(行)]。值=工作表['D'+str(行)]。值
其他:
工作表['N'+str(行)]。值=无
#2种不同的方法更新字典
dict1_1={sheet['C'+str(row)]。值:sheet['F'+str(row)]。值}
条款1.更新(条款1\u 1)
工作表['F'+str(行)]。数值=dict1[工作表['C'+str(行)]。数值]
dict2[表[D'+str(行)]。值]=表[I'+str(行)]。值
表[I'+str(行)]。值=dict2[表[D'+str(行)]。值]

您实际上是在用VBA伪装成Python进行编码。如果您将Excel视为可视化/导出工具,将所有值读取到Pandas数据框中,实际上要简单得多
将Pandas作为pd导入;df=pd.read_Excel('input.xlsx'))
并在那里进行计算,最后通过
df.to_Excel('output.xlsx)
将其导出到Excel。您可以在Excel中设置此类型的模型,并使用解算器迭代到“最佳”解决方案…请看下面的内容:@ycx是的,我知道数据框架非常适合分析Excel工作表,我也在使用它们。但是数据框架如何能够
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]