我遇到了一个有趣的问题:
file1.csv有几百行,如:
Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15
file2.csv有大约1,100万行,如:
id,D,Sym,DateTime,Bid,Ask
1375022797,D,USD,2010-12-26 17:00:15,1.311400,1.311700
1375022965,D,USD,2010-12-26 17:00:56,1.311200,1.311500
1375022984,D,USD,2010-12-26 17:00:56,1.311300,1.311600
1375023013,D,USD,2010-12-26 17:01:01,1.311200,1.311500
1375023039,D,USD,2010-12-26 17:01:02,1.311100,1.311400
1375023055,D,USD,2010-12-26 17:01:03,1.311200,1.311500
1375023063,D,USD,2010-12-26 17:01:03,1.311300,1.311600
我要做的是编写一个脚本,该文件获取file1.csv中的每个DTime值,并在file2.csv的DateTime列中找到部分匹配的第一个实例,并输出DateTime,Bid,Ask for那一排。部分匹配在前16个字符上。
这两个文件都是从最旧到最新排序的,所以如果file1.csv中的“2010-12-26 17:01”匹配file2.csv中的4个条目,我只需要提取第一个:“2010-12- 26 17:01:01“
不确定如何继续..我尝试了字典,但值的顺序很重要,所以我不确定这是否有效。也许将file1的DTime列放入列表中,对于该列表中的每个条目,在file2中搜索DateTime?
谢谢你们
答案 0 :(得分:6)
如果您没有重复的DTime
值,则应该有效:
import csv
file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")
header1 = file1reader.next() #header
header2 = file2reader.next() #header
for Code, DTime in file1reader:
for id_, D, Sym, DateTime, Bid, Ask in file2reader:
if DateTime.startswith(DTime): # found it
print DateTime, Bid, Ask # output data
break # break and continue where we left next time
修改强>
import csv
from datetime import datetime
file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")
header1 = file1reader.next() #header
header2 = file2reader.next() #header
for Code, DTime in file1reader:
DTime = datetime.strptime(DTime, "%Y-%m-%d %H:%M")
for id_, D, Sym, DateTime, Bid, Ask in file2reader:
DateTime = datetime.strptime(DateTime, "%Y-%m-%d %H:%M:%S")
if DateTime>=DTime: # found it
print DateTime, Bid, Ask # output data
break # break and continue where we left next time
答案 1 :(得分:3)
除非你只需要这样做一次,否则你应该真正使用数据库。向table2添加一个包含DATETIME而没有秒的列,这样您就可以加入完全匹配,而不是LIKE。
如果您索引这些列,它会很快,甚至更快。如果您也可以将file1.csv存储在数据库中,则不需要迭代:您可以在单个选择查询中获取整个结果集。这就是SQL的用途。
PS。如果您决定采用这种方法,可以向查询寻求帮助。
答案 2 :(得分:1)
您可以从file2创建一个字典,其中键是您想要的时间的前缀,该值是第一行或与此前缀匹配的所有行。 那么这只是做一些事情的事情:
entries = file2Dict.get(file1Entry)
if entries:
print "First entry is %s" entries[0]