如何用python进行数据清洗ETL
#python语言 import pandas as pd import time data = pd.read_excel('ETL_数据清洗挑战.xlsx','测试数据',dtype=str)#读取数据 data_dict = data.to_dict(orient = 'dict')#将数据转换为字典 #print(data['CHECK_POINT']) listDate = []#创建列表并初始化 for cell in data_dict['CHECK_POINT'].values():#遍历字典当中keys='CHECK_POINT'的values if(len(cell) == 11):#判定日期数据的格式是否统一 cell = str(cell)#将日期数据转化为字符串 cell = cell[:-1]#统一日期格式 date = time.strptime(str(cell),"%Y-%m-%d")#确定日期格式 date = time.strftime('%Y-%m-%d',date)#规定日期格式 else: date = time.strptime(str(cell), "%Y-%m-%d")#确定日期格式 date = time.strftime('%Y-%m-%d',date)#规定日期格式 #print(date) listDate.append(date)#将统一后的日期存入列表 data_dict['CHECK_POINT'] = listDate#更新数据字典 #print(listDate) id_list = {}#创建列表并初始化 index = 0#初始化索引为'0' for id in data_dict['ID'].values():#遍历keys = 'ID'的values #print(data_dict['ID'].values()) if id not in id_list.keys():#判断列表的keys值, id_list[id] = []#初始化id_list id_list[id].append(index)#将keys相等的index存入id_list中 index+=1#存入index后自增 #print(id_list) day_dict = {}#创建字典 for i,j in id_list.items():#遍历id_list,i,j,分别存放keys和values seq_no_list = [data_dict['SEQ_NO'][no] for no in j]#将keys相等的'SEQ_NO'分类存放 chect_point_list = [data_dict['CHECK_POINT'][no] for no in j]#将keys相等的'CHECK_POINT'分类存放 data_list = list(zip(seq_no_list,chect_point_list))#合并列表 #print(data_list) for rows in range(len(data_list)-1,-1,-1):#因为要删除列表中的某些信息,避免遍历时数据超出边界,所以倒序遍历列表 df = data_list[rows]#变量df存放当前indexs的values if(df[0] != '0034') and (df[0] != '0036') and (df[0] != '0048'):#判断values的值是否为需要判断的'0034'、'0036'、'0048' data_list.remove(df)#使用remove()函数执行删除操作 #print(data_list) for rows in range(len(data_list)-1,-1,-1):#因为要删除列表中的某些信息,避免遍历时数据超出边界,所以倒序遍历列表 df1 = data_list[rows]#变量df1存放当前index的values df2 = data_list[rows - 1]#变量df2存放当前index.next的values if(df1[0] == '0034') and (df2[0] == '0034'):#判断是否有重复的'SEQ_NO',重复时按照规则删掉相应的冗余值 data_list.remove(df1)#使用remove()函数执行删除操作 elif(df1[0] == '0036') and (df2[0] == '0036'):#同上 df3 = data_list[rows - 2]#使用remove()函数执行删除操作 #print(df3) if(df3[0] == '0034'):#同上 data_list.remove(df2)#使用remove()函数执行删除操作 else: data_list.remove(df1)#使用remove()函数执行删除操作 elif(df1[0] == '0048') and (df2[0] == '0048'):#同上 data_list.remove(df2)#使用remove()函数执行删除操作 day_dict[i] = data_list[0:]#将列表按照'ID'分类并存放到day_dict字典中 #print(data_list) #print(day_dict) for keys,values in day_dict.items():#分别使用变量keys,values,来遍历day_dict days = 0#初始化天数 for cell in range(len(values)-1,-1,-1):#倒序遍历values的values if(values[cell][0] == '0048') and ((values[cell-1][0] == '0036') or (values[cell-1][0] == '0034')):#确定start_day和end_day的范围 start_day = int(str(values[cell-1][1])[8:])#将日期中的天数转化为int型并存放到start_day中 end_day = int(str(values[cell][1])[8:])#将日期中的天数转化为int型并存放到end_day中 if(end_day > start_day) and ((end_day - start_day) > 0):#判断日期的时间顺序是否正确 days += (end_day - start_day)#将日期的天数进行累加 elif(values[cell][0] == '0036') and (values[cell-1][0] == '0034'):#确定start_day和end_day的范围 start_day = int(str(values[cell-1][1])[8:])#将日期中的天数转化为int型并存放到start_day中 end_day = int(str(values[cell][1])[8:])#将日期中的天数转化为int型并存放到end_day中 if (end_day > start_day) and ((end_day - start_day) > 0):#判断日期的时间顺序是否正确 days += (end_day - start_day)#将日期的天数进行累加 days_dict = {keys:[str(days)+'days']}#将归类好的日期天数存放到days_dict字典中 print(days_dict)#输出字典中的数据