所以我一直试着想一想这怎么可能,但没有想到什么。
我有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
任何帮助将不胜感激,谢谢!
答案 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)
简而言之,您正在逐步浏览这两个文件,并在每个文件中保留一个“书签”。如果记录匹配,合并它们并打印;推进两个文件。否则,在日期中推进“后面”的书签。
答案 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}')