例如按日期链接两个来源的数据的最佳方法是什么?

时间:2016-02-03 11:33:02

标签: python

我正在写一个scipt(即一次)我正在从excel文件中读取数据。对于该数据,我根据日期和时间创建一个id。我有一个缺失的变量,它包含在一个txt文件中。 txt文件还有创建id的日期和时间。

现在我想根据id链接excel-file和txt-file中的数据。对不,我正在从txt文件构建两个列表。一个包含id,另一个包含我需要的值。然后,我从id列表中获取索引,其中使用枚举函数的两个数据集中的id相同。我使用该索引从valuelist获取值。代码看起来像这样:

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

TEXTFILE:

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。但它也可以选择留空而不是。

1 个答案:

答案 0 :(得分:1)

如果您的两个文件都按时间顺序排序,那么以下类型的方法会很快:

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格式,其工作方式如下:

  1. 为所有文件创建csv读取器/写入器。这允许文件自动作为列列表读入,而不需要拆分每一行。

  2. 从两个文件中提取标题,并将合并后的表单写入输出。

  3. 获取两个输入文件并将其传递给merge。这将按顺序从任一输入文件返回一行。

  4. 将此传递给groupby,将具有相同日期和时间的行分组。这将返回一个键和一个组,其中键是匹配的日期和时间,该组是匹配行的可迭代。

  5. 对于每个分组的条目,将每行的密钥和第2列写入输出文件。 chain用于生成一个单位列表。

  6. 这将为您提供如下输出文件:

    Date,Time,Var1,Var2,Var3
    03.02.2016,12:53:24,10,27,16
    03.02.2016,12:53:25,10,27,20
    

    由于您已经拥有excel数据,因此需要将其作为行/列的列表传递给合并而不是csv_excel