从excel中提取信息到python 2d数组

时间:2014-02-17 21:24:24

标签: python arrays excel

我有一张excel表,其中包含日期,时间和温度,如下所示:

enter image description here

使用python,我想将这些信息提取到python数组中。

数组将获取位置0的日期,然后将temps存储在以下位置,如下所示:

temparray[0] = [20130102,34.75,34.66,34.6,34.6,....,34.86]
temparray[1] = [20130103,34.65,34.65,34.73,34.81,....,34.64]

这是我的尝试,但很糟糕:

from xlrd import * 

print open_workbook('temp.xlsx')

wb = open_workbook('temp.xlsx')

for s in wb.sheets():
    for row in range(s.nrows):
        values = []
        for col in range(s.ncols):
            values.append(s.cell(row,col).value)
        print(values[0])
        print("%.2f" % values[1])
        print'''

我使用了xlrd,但我愿意使用任何东西。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

根据我对你的问题的理解,问题在于你希望输出是一个列表列表,而你却没有得到这样的东西。

那是因为你的代码中没有任何东西甚至尝试来获得这样的东西。对于每一行,您构建一个列表,打印出该列表的第一个值,打印出该列表的第二个值,然后忘记该列表。

要将每个行列表附加到列表的大列表中,您所要做的就是将每个列值附加到行列表时所做的完全相同的事情:

temparray = []
for row in range(s.nrows):
    values = []
    for col in range(s.ncols):
        values.append(s.cell(row,col).value)
    temparray.append(values)

从您的评论中看,您实际想要的不仅仅是这个,而且还将白天的温度分组,并且只添加第二列,而不是所有值,每一天。这根本不是你在问题中描述的内容。在这种情况下,你根本不应该在列上循环。你想要的是这样的:

days = []
current_day, current_date = [], None
for row in range(s.nrows):
    date = s.cell(row, 0)
    if date != current_date:
        current_day, current_date = [], date
        days.append(current_day)
    current_day.append(s.cell(row, 2))

此代码假定日期始终按排序顺序排列,因为它们位于输入屏幕截图中。

我可能会以不同的方式构造它,构建一个行迭代器以传递给itertools.groupby,但我希望将其保持为新手友好,并尽可能接近原始代码。

另外,我怀疑你真的不想要这个:

[[date1, temp1a, temp1b, temp1c], 
 [date2, temp2a, temp2b]]

......而是这样的事情:

{date1: [temp1a, temp1b, temp1c], 
 date2: [temp1a, temp1b, temp1c]}

但是如果不知道您打算这些信息,我无法告诉您如何最好地存储它。

答案 1 :(得分:1)

如果您希望保留相同日期的所有数据,我可能会建议使用字典来获取特定日期的临时列表。然后,一旦用数据初始化了dict,就可以重新排列你喜欢的方式。在wb=open_workbook('temp.xlsx')之后尝试这样的事情:

tmpDict = {}
for s in wb.sheets():
    for row in xrange(s.nrows):
        try:
            tmpDict[s.cell(row, 0)].append(s.cell(row, 2).value)
        except KeyError:
            tmpDict[s.cell(row, 0)] = [s.cell(row,2).value]

如果你打印tmpDict,你应该得到一个输出:

{date1: [temp1, temp2, temp3, ...],
 date2: [temp1, temp2, temp3, ...]
 ...}

字典键以任意顺序保存(它与键的哈希值有关),但您可以根据字典的内容构建列表列表,如下所示:

tmpList = []
for key in sorted(tmpDict.keys):
    valList = [key]
    valList.extend(tmpDict[key])
    tmpList.append(valList)

然后,您将获得按日期排序的列表列表,其中包含val,就像您最初的工作一样。但是,您始终可以使用键获取字典中的值。我通常发现之后使用数据更容易,但您可以将其更改为您需要的任何形式。