Python 如何循环处理不匹配的数据

Python 如何循环处理不匹配的数据,python,excel,csv,date,text,Python,Excel,Csv,Date,Text,所以我一直在想这是怎么可能的,但什么都没想到 我有2个csv文件,其中包含日期和数据。但是,日期不匹配。我希望能够编写一个代码,使我能够循环遍历所有数据,找到匹配的日期,然后创建一个文本文档,其中包含共同的日期和单独工作表中的两个数据值。另一种选择是自己在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 |

所以我一直在想这是怎么可能的,但什么都没想到

我有2个csv文件,其中包含日期和数据。但是,日期不匹配。我希望能够编写一个代码,使我能够循环遍历所有数据,找到匹配的日期,然后创建一个文本文档,其中包含共同的日期和单独工作表中的两个数据值。另一种选择是自己在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
我希望返回的是(在运行循环之后):

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

  • 从每个文件中读取第一条记录,r1r2
  • 提取日期d1d2
  • 虽然两个文件中都有剩余数据:
    • 如果d1==d2:
      • 合并记录并打印
      • 获取每个文件的下一行(新的r1r2
    • 否则,如果d1
    • 获取下一个r1
  • 否则
    • 获取下一个r2
简单地说,您将逐步浏览这两个文件,并在每个文件中保留一个“书签”。如果记录匹配,则合并并打印;推进两个文件。否则,请将日期中“落后”的书签提前。

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

简单地说,您将逐步浏览这两个文件,并在每个文件中保留一个“书签”。如果记录匹配,则合并并打印;推进两个文件。否则,推进日期中“落后”的书签。

使用CSV模块读取这两个文件,将它们转换为映射日期的字典,然后打印它们

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}')

使用CSV模块读取两个文件,将它们转换为映射<代码>日期=><代码>列表[值],然后打印它们

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}')

我认为pandas-join逻辑非常适合这个任务,因为您实际上是在请求按日期键控的内部连接

首先为日期定义一个解析函数(我添加了这个函数,以防您需要将这些日期视为实际日期,以便在python中进行进一步处理)。然后将每个csv文件加载到单独的数据框中。最后,连接并删除
NaN
值以获得您所寻求的内部连接(或者通过在
join
函数中设置
how
参数来明确内部连接)。您还可以使用
to_csv
功能轻松地将输出数据帧放入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")

我认为pandas-join逻辑非常适合这个任务,因为您实际上是在请求按日期键控的内部连接

首先为日期定义一个解析函数(我添加了这个函数,以防您需要将这些日期视为实际日期,以便在python中进行进一步处理)。然后将每个csv文件加载到单独的数据框中。最后,连接并删除
NaN
值以获得您所寻求的内部连接(或者通过在
join
函数中设置
how
参数来明确内部连接)。您还可以使用
to_csv
功能轻松地将输出数据帧放入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")
使用一组列表存储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])
这将(几乎)生成所需的文件,唯一的区别是分隔符是单个的
,而不是
(带空格)。我还假设输入文件的分隔方式类似。

使用一组列表存储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])
这将(几乎)生成所需的文件,唯一的区别是分隔符是单个的
,而不是
(带空格)。我还假设输入文件的分隔方式类似