python之ETL數據清洗案例源代碼
阿新 • • 發佈:2019-04-28
spa 列表 star xlsx class pre 讀取 check 重復
#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] == ‘