#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)#输出字典中的数据

python之ETL数据清洗案例源代码的更多相关文章

  1. Python的元编程案例

    Python的元编程案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是元编程 元编程概念来自LISP和smalltalk. 我们写程序是直接写代码,是否能够用代码来生成 ...

  2. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  3. LDA线性判别分析原理及python应用(葡萄酒案例分析)

    目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...

  4. Python爬虫(十一)_案例:使用正则表达式的爬虫

    本章将结合先前所学的爬虫和正则表达式知识,做一个简单的爬虫案例,更多内容请参考:Python学习指南 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了. 下面我们一起 ...

  5. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  6. 参考《Python数据处理》中英文PDF+源代码

    在实际操作中掌握数据处理方法,比较实用.采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.E ...

  7. Python使用pyexecjs代码案例解析

    针对现在大部分的网站都是使用js加密,js加载的,并不能直接抓取出来,这时候就不得不适用一些三方类库来执行js语句 execjs,一个比较好用且容易上手的类库(支持py2,与py3),支持 JS ru ...

  8. 无语怎么这么简单!——python实现中文字幕雨+源代码(源码可赠)

    大家好鸭,我是小熊猫 最近浏览了很多关于用Python和Pygame实现代码雨的案例,发现很多都是没有深入讲解代码的整个实现过程,从0到1教会你制作中文文字雨(其实啥字好像都可以). 然后在介绍的过程 ...

  9. Python实现中文字幕雨+源代码

    写在前面的一些P话: 最近浏览了很多关于用Python和Pygame实现代码雨的案例,发现很多都是没有深入讲解代码的整个实现过程,从0到1教会你制作中文文字雨. 然后在介绍的过程中,我也将深入介绍Py ...

随机推荐

  1. kbmmw 的HTTPSmartService入门

    前面介绍过kbmmw 中的smartservice. 这个既可以用于kbmmw 的客户端,也可以使用http 访问. 在新版的kbmmw里面,作者加强了http 的支持,我们可以只使用HTTPSmar ...

  2. mac挂载ntfs文件系统方法

    1.插入磁盘,并查看 zz@pzdeMacBook-Pro:~/Volumes/ntfs16g$ df Filesystem 512-blocks Used Available Capacity iu ...

  3. 虚拟机 与 主机 Ping 中的设置

    这段时间是学习华清远见的Linux A8 关于Linux移植,遇到虚拟机与主机Ping不通.经查阅后总结出以下 VM中设置. “虚拟机设置-->硬件--> 网络适配器--> 桥接模式 ...

  4. CHAPITRE II

    J'ai ainsi vécu seul, sans personne avec qui parler véritablement, jusqu'à une panne[pan][机]故障 dans ...

  5. Codeforces Round #543 (Div. 2)B,C

    https://codeforces.com/contest/1121 B 题意 给你n(<=1000)个数ai,找出最多对和相等的数,每个数只能用一次,且每个数保证各不相同 题解 重点:每个数 ...

  6. bind函数(c++11)

    1.概念 1)c++11使用bind()函数可以向函数传递参数,一般调用形式为: 返回的newCallable是一个可调用的对象,callable是需要传参的函数,arg_list是参数列表 2)bi ...

  7. canvas制作表盘

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. Nios II——定制自己的IP1之Nios接口类型

    信号自动识别的接口前缀 接口前缀 接口类型 asi Avalon-ST宿端口(输入) aso Avalon-ST源端口(输出) avm Avalon-MM主端口 avs Avalon-MM从端口 ax ...

  9. 【Java】Java批量文件打包下载zip

    网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /*      * 另存为      */     @Request ...

  10. Ng第十二课:支持向量机(Support Vector Machines)(一)

    1 目录 支持向量机基本上是最好的有监督学习算法了,从logistic回归出发,引出了SVM,揭示模型间的联系,过渡自然. 2 重新审视logistic回归 Logistic回归目的是从特征学习出一个 ...