Python 循环浏览一个csv文件的行,以在另一个csv文件中查找相应的数据
我有一个有趣的问题: file1.csv有几百行,如:Python 循环浏览一个csv文件的行,以在另一个csv文件中查找相应的数据,python,csv,Python,Csv,我有一个有趣的问题: file1.csv有几百行,如: Code,DTime 1,2010-12-26 17:01 2,2010-12-26 17:07 2,2010-12-26 17:15 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,
Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15
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
file2.csv大约有1100万行,如:
Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15
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以获取该行。部分匹配在前16个字符上
这两个文件都是从最早到最新排序的,因此如果file1.csv中的“2010-12-26 17:01”与file2.csv中的4个条目相匹配,我只需要提取第一个条目:“2010-12-26 17:01:01”
我不知道该怎么办。。我试过查字典,但值的顺序很重要,所以我不确定这是否有效。可能会将file1的DTime列放入一个列表,并为该列表中的每个条目在file2中搜索DateTime
谢谢大家您可以从文件2创建字典,其中键是所需时间的前缀,值为第一行或与此前缀匹配的所有行。 那么,这只是做一些事情的问题,比如:
entries = file2Dict.get(file1Entry)
if entries:
print "First entry is %s" entries[0]
如果您没有重复的
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
除非您只需要这样做一次,否则您应该真正使用数据库。在table2中添加一列,该列包含DATETIME而不包含秒数,这样您就可以在完全匹配的情况下加入,而不是使用LIKE 它会很快,如果你为这些列建立索引,速度会更快。如果您也可以在数据库中存储file1.csv,则不需要迭代:您可以在一个select查询中获得整个结果集。这就是SQL的用武之地
注:如果您决定采用这种方法,您可以寻求查询方面的帮助。如果您将问题放入数据库并进行连接,那么问题就不那么有趣了;)我在access和mysql中尝试了一种数据库方法,但在尝试左键连接这两个表时遇到了问题。唯一快速运行的sql查询是从tblTicks WHERE(DateTime)中选择排名前1的DateTime、Bid、Ask,如“2010-12-26 17:01*”;当我尝试对第一个表进行任何迭代时,它冻结了。。虽然python会处理得更好一些,但是使用通配符进行字符串搜索肯定会很慢。我建议在您有时间和资源正确迁移时使用数据库方法。在选择索引时考虑这些类型的慢查询,这几乎起作用了!它实际上发现我在文件2中的数据有问题。在寻找“2010-01-06 20:00”时,它没有找到它。。相反,文件2中的邻近值是“2010-01-06 19:59:20”和“2010-01-06 20:01:14”-理想情况下,我将选择序列中的下一个值,即20:01:14。这里是否需要“datetime”类?能否验证是否需要将
if datetime.startswith(DTime):
更改为if datetime>=DTime:
这似乎确实可以。尝试了这两种方法:>=和datetime都很好地工作了!非常感谢你的帮助@用户1249464:啊,对<代码>>=不带日期时间也可以,因为日期格式是可排序的。我想我会对结果数据做更多的工作。我应该使用id作为键将其加载到字典中吗?我想我只需要更换打印行,对吗?