#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. Leetcode: Line Reflection

    Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...

  2. Java基础知识系列——目录操作

    Java对目录操作的许多方法与上一篇文件操作的方法很多是一样的. java.io.File file = new File( "D:\1\2\3\4"); 1.递归创建目录 fil ...

  3. 获取MSSQL Server中的相关信息(视图、存储过程、触发器、表)

    在SQL SERVER得到某个数据库下面所有的表.视图.存储过程.触发器 select name from sysobjects where xtype='TR' --所有触发器select name ...

  4. Java正则表达式之语法规则

    正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理.正则表达式提供了一种 ...

  5. apt-get命令学习

    在windows下安装软件,我们只需要有EXE文件,然后双击,下一步直接OK就可以了.但在LINUX下,不是这样的.每个LINUX的发行版,比如UBUNTU,都会维护一个自己的软件仓库,我们常用的几乎 ...

  6. Raw-OS互斥的源代码分析的量的Mutex

    作为分析的内核版本2014-04-15,基于1.05正式版.blogs我们会跟上的内核开发进度的最新版本,如果出现源代码的目光"???"的话,没有深究的部分是理解. Raw-OS官 ...

  7. python js(JavaScript)初识

    ####################总结############## 引入: 可以在body标签中放入<script type=”text/javascript”></scrip ...

  8. yii2 对象跟数组输出数据到view视图方法

    public function actionJiekou(){ $url = 'http://wap.guoshihui.com/_static/wap/video/startVideo.mp4'; ...

  9. C 语言整型谜题

    如题,此篇文章是描述C语言中的整数谜题. 假定机器字长是32位的,用2的补码表示整数.对以下C表达式,请问它们在所有情况下都正确吗?如果不是,请给出反例. 初始化: 1 2 3 4 int x = f ...

  10. 使用wifite破解路由器密码

    使用wifite破解路由器密码 发表于 2016-02-06   |   分类于 wifite  |   暂无评论  |   10次阅读 简介 wifite是一款自动化wep.wpa破解工具,不支持w ...