python 读取csv问题拜求大神

jp163123 2019-01-25 10:25:02
1,a,b,2018-01-01,2018-03-01
2,a,b,2018-01-01,2018-02-01
3,a,b,2018-03-01,2018-04-01
4,a,c,2018-01-01,2018-03-01
5,a,c,2018-04-01,2018-05-01
6,b,b,2018-01-03,2018-03-01
7,b,b,2018-01-01,2018-02-01
8,a,b,2018-03-01,2018-03-22
9,a,b,2018-04-05,2018-06-22
10,a,b,2018-07-01,2018-07-22

数据文件如上所示,需求:第一列编号小的顺序循环跟比它大的比较,如果第二列和第三列相等,判断第四列和第五列,如果与之相比的第四列和第五列的时间范围在它之内为错误数据,把数据抛出来,抛出来的数据不再参与比较。
如示例错误数据为
2,a,b,2018-01-01,2018-02-01
7,b,b,2018-01-01,2018-02-01
8,a,b,2018-03-01,2018-03-22

...全文
116 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jp163123 2019-01-25
  • 打赏
  • 举报
回复
自己顶下,求大神的代码呀。。
ruancan 2019-01-25
  • 打赏
  • 举报
回复
假设数据在a.csv文件里边有如下数据:
1,a,b,2018-01-01,2018-03-01
2,a,b,2018-01-01,2018-02-01
3,a,b,2018-03-01,2018-04-01
4,a,c,2018-01-01,2018-03-01
11,a,c,2018-01-01,2018-03-01
5,a,c,2018-04-01,2018-05-01
8,a,b,2018-03-01,2018-03-22
9,a,b,2018-04-05,2018-06-22
10,a,b,2018-07-01,2018-07-22
6,b,b,2018-01-03,2018-03-01
7,b,b,2018-01-01,2018-02-01
代码如下:

from datetime import datetime


class Data:
def __init__(self, index, first, second, start_date, end_date):
self.index = index
self.first = first
self.second = second
self.start_date = datetime.strptime(start_date, '%Y-%m-%d')
self.end_date = datetime.strptime(end_date, '%Y-%m-%d')

def __gt__(self, other):
return (self.start_date <= other.start_date) and (self.end_date >= other.end_date)

def is_comparable(self, other):
return self.first == other.first and self.second == other.second


def check(params):
tmp_list = []
result = []
is_append = []
for line in params:
tmp_list.append(Data(*line))

for i in range(len(tmp_list)):
for j in range(i, len(tmp_list)):
if i == j:
continue
else:
if tmp_list[i].is_comparable(tmp_list[j]) and tmp_list[i] > tmp_list[j] and (j not in is_append):
result.append(params[j])
is_append.append(j)
return result


if __name__ == '__main__':
the_data = []
with open('a.csv') as f:
for line in f:
the_data.append(line.replace('\n', '').split(','))
print(check(the_data))

jp163123 2019-01-25
  • 打赏
  • 举报
回复
引用 4 楼 jp163123 的回复:
[quote=引用 3 楼 ruancan 的回复:]
如果确定了只需要从上往下比,把37行修改成for j in range(i,len(tmp_list)):即可


大神,数据可以按照id的大小排序好在做处理,其实数据是无序存在csv文件里的,要按照从小到大的顺序好再处理,我拿您的代码调试了半天还是结果还是没调通,给个完整的代码吧,先用python打开csv文件再处理数据。。非常感谢!!!![/quote]

引用 2 楼 ruancan 的回复:
照你的算法第7个应该不是错的,
代码如下:

from datetime import datetime

datas = [[1, 'a', 'b', '2018-01-01', '2018-03-01'],
[2, 'a', 'b', '2018-01-01', '2018-02-01'],
[3, 'a', 'b', '2018-03-01', '2018-04-01'],
[4, 'a', 'c', '2018-01-01', '2018-03-01'],
[5, 'a', 'c', '2018-04-01', '2018-05-01'],
[6, 'b', 'b', '2018-01-03', '2018-03-01'],
[7, 'b', 'b', '2018-01-01', '2018-02-01'],
[8, 'a', 'b', '2018-03-01', '2018-03-22'],
[9, 'a', 'b', '2018-04-05', '2018-06-22'],
[10, 'a', 'b', '2018-07-01', '2018-07-22']]


class Data:
def __init__(self, index, first, second, start_date, end_date):
self.index = index
self.first = first
self.second = second
self.start_date = datetime.strptime(start_date, '%Y-%m-%d')
self.end_date = datetime.strptime(end_date, '%Y-%m-%d')

def __gt__(self, other):
return (self.start_date <= other.start_date) and (self.end_date >= other.end_date)

def is_comparable(self, other):
return self.first == other.first and self.second == other.second


def check(params):
tmp_list = []
result = []
for line in params:
tmp_list.append(Data(*line))

for i in range(len(tmp_list)):
for j in range(len(tmp_list)):
if i == j:
continue
else:
if tmp_list[i].is_comparable(tmp_list[j]) and tmp_list[i] > tmp_list[j]:
result.append(params[j])
return result


if __name__ == '__main__':
print(check(datas))





大神,数据可以按照id的大小排序好在做处理,其实数据是无序存在csv文件里的,要按照从小到大的顺序排好再处理,我拿您的代码调试了半天还是结果还是没调通,给个完整的代码吧,先用python打开csv文件再处理数据。。非常感谢!!!![/quote]

[quote=引用 2 楼 ruancan 的回复:]
照你的算法第7个应该不是错的,
代码如下:
[code=python]
from datetime import datetime

datas = [[1, 'a', 'b', '2018-01-01', '2018-03-01'],
[2, 'a', 'b', '2018-01-01', '2018-02-01'],
[3, 'a', 'b', '2018-03-01', '2018-04-01'],
[4, 'a', 'c', '2018-01-01', '2018-03-01'],
[5, 'a', 'c', '2018-04-01', '2018-05-01'],
[6, 'b', 'b', '2018-01-03', '2018-03-01'],
[7, 'b', 'b', '2018-01-01', '2018-02-01'],
[8, 'a', 'b', '2018-03-01', '2018-03-22'],
[9, 'a', 'b', '2018-04-05', '2018-06-22'],
[10, 'a', 'b', '2018-07-01', '2018-07-22']]


class Data:
def __init__(self, index, first, second, start_date, end_date):
self.index = index
self.first = first
self.second = second
self.start_date = datetime.strptime(start_date, '%Y-%m-%d')
self.end_date = datetime.strptime(end_date, '%Y-%m-%d')

def __gt__(self, other):
return (self.start_date <= other.start_date) and (self.end_date >= other.end_date)

def is_comparable(self, other):
return self.first == other.first and self.second == other.second


def check(params):
tmp_list = []
result = []
for line in params:
tmp_list.append(Data(*line))

for i in range(len(tmp_list)):
for j in range(len(tmp_list)):
if i == j:
continue
else:
if tmp_list[i].is_comparable(tmp_list[j]) and tmp_list[i] > tmp_list[j]:
result.append(params[j])
return result


if __name__ == '__main__':
print(check(datas))

大神,数据可以按照id的大小排序好在做处理,其实数据是无序存在csv文件里的,要按照从小到大的顺序排好再处理,我拿您的代码调试了半天还是结果还是没调通,给个完整的代码吧,先用python打开csv文件再处理数据。。非常感谢!!!!
jp163123 2019-01-25
  • 打赏
  • 举报
回复
引用 3 楼 ruancan 的回复:
如果确定了只需要从上往下比,把37行修改成for j in range(i,len(tmp_list)):即可


大神,数据可以按照id的大小排序好在做处理,其实数据是无序存在csv文件里的,要按照从小到大的顺序好再处理,我拿您的代码调试了半天还是结果还是没调通,给个完整的代码吧,先用python打开csv文件再处理数据。。非常感谢!!!!
ruancan 2019-01-25
  • 打赏
  • 举报
回复
如果确定了只需要从上往下比,把37行修改成for j in range(i,len(tmp_list)):即可
ruancan 2019-01-25
  • 打赏
  • 举报
回复
照你的算法第7个应该不是错的,
代码如下:

from datetime import datetime

datas = [[1, 'a', 'b', '2018-01-01', '2018-03-01'],
[2, 'a', 'b', '2018-01-01', '2018-02-01'],
[3, 'a', 'b', '2018-03-01', '2018-04-01'],
[4, 'a', 'c', '2018-01-01', '2018-03-01'],
[5, 'a', 'c', '2018-04-01', '2018-05-01'],
[6, 'b', 'b', '2018-01-03', '2018-03-01'],
[7, 'b', 'b', '2018-01-01', '2018-02-01'],
[8, 'a', 'b', '2018-03-01', '2018-03-22'],
[9, 'a', 'b', '2018-04-05', '2018-06-22'],
[10, 'a', 'b', '2018-07-01', '2018-07-22']]


class Data:
def __init__(self, index, first, second, start_date, end_date):
self.index = index
self.first = first
self.second = second
self.start_date = datetime.strptime(start_date, '%Y-%m-%d')
self.end_date = datetime.strptime(end_date, '%Y-%m-%d')

def __gt__(self, other):
return (self.start_date <= other.start_date) and (self.end_date >= other.end_date)

def is_comparable(self, other):
return self.first == other.first and self.second == other.second


def check(params):
tmp_list = []
result = []
for line in params:
tmp_list.append(Data(*line))

for i in range(len(tmp_list)):
for j in range(len(tmp_list)):
if i == j:
continue
else:
if tmp_list[i].is_comparable(tmp_list[j]) and tmp_list[i] > tmp_list[j]:
result.append(params[j])
return result


if __name__ == '__main__':
print(check(datas))

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧