#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. Python之字符串基本操作

    #!/usr/bin/env python#-*-coding utf8-*-#Author:caojininfo = { 'stu1001': 'caojin', 'stu1002': 'zhaom ...

  2. keras框架的MLP手写数字识别MNIST,梳理?

    keras框架的MLP手写数字识别MNIST 代码: # coding: utf-8 # In[1]: import numpy as np import pandas as pd from kera ...

  3. 47.iOS跳转AppStore评分和发送邮件

    1.跳转到AppStore评分 应用地址是关键:IOS 设备,手机搜索应用,拷贝链接 NSString *appStr =@"https://itunes.apple.com/cn/app/ ...

  4. 2018.11.07 hdu1465不容易系列之一(二项式反演)

    传送门 其实标签只是搞笑的. 没那么难. 二项式反演只是杀鸡用牛刀而已. 这道题也只是让你n≤20n\le20n≤20的错排数而已. 还记得那个O(n)O(n)O(n)的递推式吗? 没错那个方法比我今 ...

  5. SELECT INTO创建临时表

    SELECT INTO创建临时表 SQL Server临时表有两种类型:本地和全局.它们在名称.可见性以及可用性上有区别.本地临时表的名称以单个数字符号 (#) 打头:它们仅对当前的用户连接是可见的: ...

  6. poj-3177(并查集+双联通分量+Tarjan算法)

    题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...

  7. MFC调试时无法解析外部类

    1.是否添加头文件 2.是否对类进行声明

  8. 如何制作chm文件

    本文介绍如何从一个包中的docs文档生成一个chm文档. 1,准备软件Easy CHM 这个网上有下载,下载后安装,至于怎么使用,等下再介绍.安装之后如下图. 2,准备文件 比如我这里下载了一个cxf ...

  9. java并发控制工具类和集合等

    转载自:https://my.oschina.net/hosee/blog/607677 摘要: 本系列基于炼数成金课程,为了更好的学习,做了系列的记录. 本文主要介绍: 1.各种同步控制工具的使用 ...

  10. mybatis-generator扩展教程系列 -- 自定义generatorConfig.xml参数

    http://blog.csdn.net/shadowsick/article/details/53413235