如何循环不匹配的数据

时间:2017-10-10 00:44:37

标签: python excel csv date text

所以我一直试着想一想这怎么可能,但没有想到什么。

我有2个csv文件,其中包含日期和数据。但是,日期不匹配。我希望能够编写一个代码,允许我遍历所有数据,找到匹配的日期,然后创建一个具有共同日期的文本文档和来自单独工作表的2个数据值。另一种选择是在excel中自己匹配它们。

有什么建议吗?

实施例。我想要完成的事情:

说我有这个文件1:

01/01/01 | 1 
01/02/01 | 2 
01/03/01 | 3 
01/04/01 | 4 
01/05/01 | 5 
01/06/01 | 6 
01/07/01 | 7 
01/08/01 | 8 

和这个文件2:

01/05/01 | 9  
01/06/01 | 22 
01/07/01 | 33 
01/08/01 | 44
01/09/01 | 55
01/10/01 | 66
01/11/01 | 77
01/12/01 | 88

我希望返回的是(在运行循环之后):

01/05/01 | 5 | 9
01/06/01 | 6 | 22
01/07/01 | 7 | 33
01/08/01 | 8 | 44

任何帮助将不胜感激,谢谢!

4 个答案:

答案 0 :(得分:1)

我认为pandas join逻辑非常适合这项任务,因为你实际上要求按日期键入内连接。

首先为你的日期定义一个解析函数(如果你需要将这些函数视为python中进一步处理的实际日期,我会添加它)。然后将每个csv文件加载到单独的数据帧中。最后,通过在NaN函数中设置how参数,加入和删除join值以获取您要搜索的内部联接(或者只是显式内部联接)。您还可以使用to_csv函数轻松地将outptut数据帧放入csv文件中。

如果您希望通过聚合或加入获得更多创意,那么大熊猫是可行的方法。

import pandas
parser = lambda date: pandas.datetime.strptime(date.strip(), '%y/%m/%d')
dt = pandas.read_csv('H:\\one.csv', parse_dates = [0], date_parser = parser, index_col=0, delimiter="|", names = ["date", "val"])
dt2 = pandas.read_csv('H:\\two.csv', parse_dates = [0], date_parser = parser, index_col=0, delimiter="|", names = ["date", "val2"])
dt.join(dt2).dropna().to_csv("H:\\output.csv")

这也可以,但是你丢失了python中所有特定于日期的功能:

import pandas
dt = pandas.read_csv('H:\\one.csv', index_col=0, delimiter="|", names = ["date", "val"])
dt2 = pandas.read_csv('H:\\two.csv', index_col=0, delimiter="|", names = ["date", "val2"])
dt.join(dt2, how='inner').to_csv("H:\\output.csv")

答案 1 :(得分:1)

使用defaultdict列表存储CSV文件中的数据,然后在dict中找到列表中包含多个值的项目。

import csv
from collections import defaultdict

merged = defaultdict(list)

for filename in 'f1.csv', 'f2.csv':
    with open(filename) as f:
        for date, value in csv.reader(f, delimiter='|'):
            merged[date].append(value)

with open('out.csv', 'w') as f:
    w = csv.writer(f, delimiter='|')
    for date in sorted(merged):
        if len(merged[date]) > 1:
            w.writerow([date] + merged[date])

这将(几乎)生成您需要的文件,唯一的区别是分隔符是单个|而不是|(带有周围空格)。我还假设输入文件类似地分隔。

答案 2 :(得分:0)

  • 阅读每个文件的第一条记录 r1 r2
  • 提取日期 d1 d2
  • 虽然两个文件中都有剩余数据:
    • 如果d1 == d2:
      • 合并记录并打印
      • 获取每个文件的下一行(新 r1 r2
    • 如果d1< D2
      • 接下来 r1
    • 否则
      • 接下来 r2

简而言之,您正在逐步浏览这两个文件,并在每个文件中保留一个“书签”。如果记录匹配,合并它们并打印;推进两个文件。否则,在日期中推进“后面”的书签。

答案 3 :(得分:0)

使用CSV模块读出这两个文件,将它们转换为映射date =>的字典。 list[values],然后打印它们。

import csv

# Extract CSV
csv1 = []
with open('first.csv', 'r') as f1:
    csv_reader = csv.reader(f1)
    for row in csv_reader:
        csv1.append(row)

csv2 = []
with open('second.csv', 'r') as f2:
    csv_reader = csv.reader(f2)
    for row in csv_reader:
        csv2.append(row)

# Initialize dict which will map dates to values
d = {}

# Map dates to values by getting a default array and appending the values
for row in csv1:
    v = d.get(row[0], [])
    v.append(row[1])
    d[row[0]] = v

for row in csv2:
    v = d.get(row[0], [])
    v.append(row[1])
    d[row[0]] = v

# Print results
for k, v in d.items():
    values = ' | '.join(list(map(str, v)))
    print(f'{k} | {values}')