【问题标题】:Getting data arrays from CSV with loops使用循环从 CSV 获取数据数组
【发布时间】:2016-04-24 20:16:24
【问题描述】:

我有一个如下所示的 CSV:

0.500187550,CPU1,7.93
0.500187550,CPU2,1.62
0.500187550,CPU3,7.93
0.500187550,CPU4,1.62
1.000445359,CPU1,9.96
1.000445359,CPU2,1.61
1.000445359,CPU3,9.96
1.000445359,CPU4,1.61
1.500674877,CPU1,9.94
1.500674877,CPU2,1.61
1.500674877,CPU3,9.94
1.500674877,CPU4,1.61

第一列是时间,第二列是CPU使用,第三列是能量。

作为最终结果,我想要这些数组:

时间:

[0.500187550, 1.000445359, 1.500674877]

能量(每个 CPU):例如CPU1

[7.93, 9.96, 9.94]

为了解析我正在使用的 CSV:

query = csv.reader(csvfile, delimiter=',', skipinitialspace=True)
#Arrays global time and power:
for row in query:
    x = row[0]
    x = float(x)
    x_array.append(x) #column 0 to array
    y = row[2]
    y = float(y)
    y_array.append(y) #column 2 to array
print x_array
print y_array

通过这种方式,我将时间和能量的所有数据放入两个数组中:x_arrayy_array

然后我对数组进行排序:

energy_core_ord_array = []
time_ord_array = []
#Dividing array into energy and time per core:
for i in range(number_cores[0]):
    e =  0 + i
    for j in range(len(x_array)/(int(number_cores[0]))):
        time_ord = x_array[e]
        time_ord_array.append(time_ord)
        energy_core_ord = y_array[e]
        energy_core_ord_array.append(energy_core_ord)
        e = e + int(number_cores[0])

最后,我将时间数组切割成它应该有的长度:

final_time_ord_array = []
for i in range(len(x_array)/(int(number_cores[0]))):
    final_time_ord = time_ord_array[i]
    final_time_ord_array.append(final_time_ord)

到这里为止,虽然代码并不优雅,但它可以工作。 当我尝试获取每个核心的数组时,问题就来了。

我为第一个内核获取它,但是当我尝试迭代下一个内核时,我不知道该怎么做,以及如何将每个数组存储在一个具有单个名称的变量中。

final_energy_core_ord_array = []
#Trunk energy core array:
for i in range(len(x_array)/(int(number_cores[0]))):
    final_energy_core_ord = energy_core_ord_array[i]
    final_energy_core_ord_array.append(final_energy_core_ord)

【问题讨论】:

  • 您是否允许为此使用 Pandas?还是您所说的仅手动处理 csv 文件?
  • 你好,我想我可以使用 Pandas,因为它是一个个人项目,我真的不知道 Pandas 是什么,将看看。本来我想在开始的时候继续,但是换一种方式没有问题。

标签: python arrays parsing csv


【解决方案1】:

因此,使用 Pandas(在 Python 中处理数据帧的库)您可以执行以下操作,这比尝试手动处理 CSV 快得多:

import pandas as pd

csvfile = "C:/Users/Simon/Desktop/test.csv"

data = pd.read_csv(csvfile, header=None, names=['time','cpu','energy'])

times = list(pd.unique(data.time.ravel()))

print times

cpuList = data.groupby(['cpu'])

cpuEnergy = {}

for i in range(len(cpuList)):
    curCPU = 'CPU' + str(i+1)
    cpuEnergy[curCPU] = list(cpuList.get_group('CPU' + str(i+1))['energy'])

for k, v in cpuEnergy.items():
    print k, v

这将给出以下输出:

[0.50018755000000004, 1.000445359, 1.5006748769999998]
CPU4 [1.6200000000000001, 1.6100000000000001, 1.6100000000000001]
CPU2 [1.6200000000000001, 1.6100000000000001, 1.6100000000000001]
CPU3 [7.9299999999999997, 9.9600000000000009, 9.9399999999999995]
CPU1 [7.9299999999999997, 9.9600000000000009, 9.9399999999999995]

【讨论】:

  • 会尽力让您知道!非常感谢!
  • 我稍微更改了答案以将答案输出为字典,这比仅使用未命名列表更好
  • 它干净多了,我想我会用这个。谢谢!
【解决方案2】:

最后我得到了答案,使用全局变量....不是一个好主意,但有效,如果有人觉得它有用,请留在这里。

    final_energy_core_ord_array = []
    #Trunk energy core array:
    a = 0
    for j in range(number_cores[0]):
        for i in range(len(x_array)/(int(number_cores[0]))):
            final_energy_core_ord = energy_core_ord_array[a + i]
            final_energy_core_ord_array.append(final_energy_core_ord)
        globals()['core%s' % j] = final_energy_core_ord_array
        final_energy_core_ord_array = []
        a = a + 12

    print 'Final time and cores:'
    print final_time_ord_array
    for j in range(number_cores[0]):
        print globals()['core%s' % j]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2019-05-28
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多