#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. tomcat项目中配置数据库连接池

    1. 在项目中新建context.xml文件,不要在tomcat服务器的目录中修改context.xml(会对整个服务器生效)..   在web项目的META-INF中存放context.xml 2. ...

  2. 通过http.client解析url返回的数据时为什么中文变成了unicode码

    今天在解析json数据的时候得到了一堆这样的数据:{"errNum":0,"errMsg":"success","retData& ...

  3. PHP中require(),include(),require_once()和include_once()有什么区别

    引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. require 的使用方法如 require("MyRequireFile.php"); . ...

  4. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  5. boost-使用说明

    1. boost库中大部分组件不需要编译,直接包含对应头文件即可使用,如#include "boost/array.hpp",因为组件的声明和实现都包含在头文件hpp中. 其它一些 ...

  6. svn更新的时候出现ERROR:Previous operation has not finished,run "clean up" if it wa interrupted;进行clean up命令也报错

    报错的截图: 然后进行了clean up命令,依旧报错了: 这种情况就有两种方法去解决了,自己可以根据自己的情况选择,哪种方便选择哪种呗! 方法一: 备份自己修改的文件,删除之前download的文件 ...

  7. JDK线程池的使用

    转载自:https://my.oschina.net/hosee/blog/614319: 摘要: 本系列基于炼数成金课程,为了更好的学习,做了系列的记录. 本文主要介绍: 1. 线程池的基本使用 2 ...

  8. 源项目 -> fork -> 本地 (如何把源项目的代码合并到本地然后推送给fork)

    git remote -v git remote add 别名 地址 git fetch 别名 git merge  别名/分支 第一步:命令行进入到本地.git 所在的目录,查看remote 信息 ...

  9. SSH 等效性问题 总提示输入密码问题

    家目录权限问题 .chmod 700 /home/.. 得到的教训就是没事儿不要乱修改家目录权限,一时方便,可能在别的地方载跟头 ~~ 浪费好许时间 哎

  10. 读《.net设计规范》

    一.影响软件品质的影响有哪些?比如性能.可靠性.安全性.依赖性管理等. 二.客户先行的编程——如果让你把自己的程序库提供的功能描述出来,并让一个开发人员在没有看过该程序库的前提下, 根据他认为该程序库 ...