连接两个数据源(例如按日期)的最佳方式是什么?

2024-09-29 08:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我想根据id链接excel文件和txt文件中的数据。不,我正在用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]]

然而,这需要很长时间,我想知道是否有更好的方法。你知道吗

文件如下所示:

Excel文件:

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时间都在textfile中。最好的选择是从textfile的前一个时间在excelfile的时间之前获取var3。但也可以选择将其留空。你知道吗


Tags: 文件数据intxtid列表fordate
1条回答
网友
1楼 · 发布于 2024-09-29 08:26:49

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

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,将具有相同日期和时间的行分组在一起。这将返回一个键和一个组,其中键是匹配的日期和时间,组是匹配行的一个iterable。

  5. 对于每个分组条目,将键和列2从每行开始写入输出文件。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数据,所以需要传递它来合并,而不是作为行/列的列表csv_excel。你知道吗

相关问题 更多 >