Python - 使用xlrd获取列标题并使用循环创建带有列标题的变量

时间:2014-11-15 22:35:01

标签: python xlrd

假设我有一个Excel文件,其中包含测试ID(字符串和数字 - 我自己并未将其命名为......),并且在测试期间以不同的增量结果(测试在特定的实例中进行) :

Inc. SV-101 GB-B1A 67.5
1    300    226    547    
2    363    344    600
3    461    444    615
.    .      .      .
.    .      .      .
.    .      .      .
10   421    444    625

我想使用xlrd打开文件。然后,我想创建一个循环,使用测试的名称创建一个列表。例如:

testID_SV-101 = ([300, 363, 461, ..., 421])
testID_GB-B1B = ([226, 344, 444, ..., 444])
testID_67.5 = ([547, 600, 615, ..., 625])

我的最终目标是使用测试结果并计算从增量4到9的斜率,然后绘制结果。说到这,这是实现我最终目标的最佳方式吗?

我已经想出了(有很多帮助)如何使用gnuplot来做到这一点,但是我预见它将无法完成我需要的所有事情,所以我决定开始学习Python。

1 个答案:

答案 0 :(得分:0)

您的数据适用于python的数字库numpy(但您也可以使用Pandas,但这仍然基于numpy。对于绘图,您应该查看例如matplotlib

您想要的是将工作表中的每一行存储为结构化数组中的记录。这是因为每一行都是与同一事物相关的逻辑事物组(例如测量结果)。稍后,您可以通过第一行中给出的名称访问所有这些名称,这些名称用于标识每个记录的含义。以下是可行的代码。

>>> import xlrd
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> 
>>> wb = xlrd.open_workbook('sto.xls')
>>> sheet = wb.sheet_by_name('Sheet1')
>>> headers = [str(cell.value) for cell in sheet.row(0)]  # extra conversion to string required for later use in record array header
>>> headers
['Inc.', 'SV-101', 'GB-B1A', '67.5']
>>> arr = []
>>> for rowind in range(sheet.nrows)[1:]:
...     arr.append([ cell.value for cell in sheet.row(rowind)])
... 
>>> arr
[[1.0, 300.0, 226.0, 547.0], [2.0, 363.0, 344.0, 600.0], [3.0, 461.0, 444.0, 615.0]]
>>> data = np.rec.fromrecords(arr, names=headers)
>>> data
rec.array([(1.0, 300.0, 226.0, 547.0), (2.0, 363.0, 344.0, 600.0),
       (3.0, 461.0, 444.0, 615.0)], 
      dtype=[('Inc.', '<f8'), ('SV-101', '<f8'), ('GB-B1A', '<f8'), ('67.5', '<f8')])
>>> data['SV-101']  # You can access columns by their name
array([ 300.,  363.,  461.])
>>> data['67.5']  # bit of a strange header name
array([ 547.,  600.,  615.])
>>> # If you want to plot e.g. the 3rd column vs the 2nd, do this:
>>> plt.plot(data['SV-101'], data['GB-B1A'])
[<matplotlib.lines.Line2D object at 0x2af3c90>]
>>> plt.show()

至于确定记录4和9之间的“斜率”,你的问题的一部分有点不清楚。你可能意味着每个连续记录之间的差异(然后是每列),在这种情况下你将得到5个值(在我的例子中只有2个):

>>> np.diff(data['SV-101'])
array([ 63.,  98.])

或者您可能只想要这两个点之间的切线斜率,在这种情况下,您可以在这些点上获取您感兴趣的值(例如'GB-B1A')并除以相应的独立变量的差值(例如'SV-101'):

>>> (data['GB-B1A'][2] - data['GB-B1A'][0])/(data['SV-101'][2] - data['SV-101'][0])
1.3540372670807452

顺便说一下,你不能让python变量的名称如testID_SV-101(因为短划线不是allowed in an identifier)或testID_67.5(因为圆点的含义不同)。< / p>