我正在编写一个scipt (即曾经),其中我正在从excel文件中读取数据。对于这些数据,我创建了一个基于日期和时间的id。我有一个缺失的变量,它包含在一个txt文件中。txt-file还具有创建id的日期和时间。
现在我想基于id链接excel文件和txt文件中的数据。对,不,我正在从txt文件构建两个列表。一个包含id,另一个包含我需要的值。然后,我使用枚举函数从id列表中获取索引,其中id在两个数据集中是相同的。我使用该索引从值列表中获取值。代码看起来像这样:
datelist = []
valuelist = []
txtfile = open(folder + os.sep + "Textfile.txt", "r")
ILines = txtfile.readlines()
for i,row in enumerate(ILines):
datelist.append(row.split(",")[1])
valuelist.append(row.split(",")[2])
rows = myexceldata
for row in rows:
x = row[id]
row = row + valuelist[[i for i,e in enumerate(datelist ) if e == x][0]]
然而,这需要很长时间,我想知道是否有更好的方法来做到这一点。
这些文件如下所示:
Excelfile:
Date Time Var1 Var2
03.02.2016 12:53:24 10 27
03.02.2016 12:53:25 10 27
03.02.2016 12:53:26 10 27
文本文件:
Date Time Var3
03.02.2016 12:53:24 16
03.02.2016 12:53:25 20
结果:
Date Time Var1 Var2 Var3
03.02.2016 12:53:24 10 27 16
03.02.2016 12:53:25 10 27 20
03.02.2016 12:53:26 10 27 *)
*)它将是完美的,如果这里的值与上面的值相同,但也可以为空
好吧,我忘了一件重要的事。很抱歉:并不是所有的excelfile文件都在文本文件中。最好的选择是在excelfile文件的时间之前从文本文件的前一时间获取var3。但也可以选择将其保留为空。
发布于 2016-02-03 12:35:54
如果你的两个文件都是按时间顺序排序的,那么下面这种方法会更快:
from heapq import merge
from itertools import groupby, chain
import csv
with open('excel.txt', 'rb') as f_excel, open('textfile.txt', 'rb') as f_text, open('output.txt', 'wb') as f_output:
csv_excel = csv.reader(f_excel)
csv_text = csv.reader(f_text)
csv_output = csv.writer(f_output)
header_excel = next(csv_excel)
header_text = next(csv_text)
csv_output.writerow(header_excel + [header_text[-1]])
for k, g in groupby(merge(csv_text, csv_excel), key=lambda x: x[0:2]):
csv_output.writerow(k + list(chain.from_iterable(cols[2:] for cols in g)))
这假设您的两个输入文件都是csv格式,并按如下方式工作:
merge
。这将按顺序从任一输入文件中一次返回一行。groupby
,以便将具有相同日期和时间的行组合在一起。这将返回一个键和一个组,其中键是匹配的日期和时间,组是匹配行的可迭代。chain
用于生成平面列表。这将为您提供如下所示的输出文件:
Date,Time,Var1,Var2,Var3
03.02.2016,12:53:24,10,27,16
03.02.2016,12:53:25,10,27,20
由于您已经有了excel数据,因此需要将其作为行/列的列表传递给merge,而不是csv_excel
。
https://stackoverflow.com/questions/35175887
复制