zoukankan      html  css  js  c++  java
  • 数据处理随笔-1

    前言

    自从工作以来,好久都没写代码了。昨天本来想着帮女朋友做些工作,结果比人家做的还慢,不仅没有吃中饭还耽误了吃晚饭的时间。但是这个过程中发生了好多有意思的事情,记下来希望对大家有所帮助。
    发现好多技能“用进退废”现象很严重,最好要实时温习。

    需求

    从一张超大的员工信息表(EXCEL)中,抽取对应列数据,计算员工的司龄。同时需要分年度统计,分别统计2015~2019年司龄满五年、司龄五年以上、司龄十年和司龄十年以上员工,主要问题是该表中既有在职员工也有离职员工。而且离职员工也要计算当年司龄。

    过程

    读取数据

    第一步就遇到问题了,因为源文件有密码,所以用pandas读取的时候会报错。出现错误XLRDError: Can't find workbook in OLE2 compound document。参考这篇文章,有两种解决方法:

    1. 删除密码保护,最简单高效,劝各位用这种方法就好。
    2. 使用‘xlwings’读取文件。

    数据整合

    想将抽取的数据列整合到一个DATaFrame中,本来用的是append方法,结果变成按行插入。虽然能用,但是不利于数据读取。最终参考这篇文章,使用zip()将提取的几列合并到一个新的DataFrame中,直接合并会失去标题行,需要重新为每列数据命名。
    new_data = pd.DataFrame(list(zip(number, name, stage)), columns = ['number', 'name', 'stage'])#number,name和stage是相应的抽取出来的列。

    数据清洗

    有些数据离职时间会有缺失,为了填补缺失,采用离职申请提交时间或者离职证明发放时间作为离职时间,如果都没有那就设置为今天。这个过程中发现问题,在excel中完全相同的格式,到了pandas总就变成三种不同格式时间,分别是float、pandas._libs.tslibs.timestamps.Timestamp、datetime.datetime。注意在同一个DataFrame中可能存在不同格式的时间。

    司龄计算

    计算司龄主要就是时间差,时间数据转化与计算参考了这篇文章

    数据输出

    来的时候是excel,输出也想要excel。使用to_excel(),结果有乱码,即使指定编码格式是utf8都不行。参考这篇文章,将编码格式设置为utf_8_sig,结果好的多。df.to_csv(file_name2, encoding='utf_8_sig')

    希望对大家有帮助!###

  • 相关阅读:
    spark 修改默认log4j.properties 配置
    shell $x的含义
    hadoop hdfs 有内网、公网ip后,本地调试访问不了集群解决
    JAVA concurrent包下Semaphore、CountDownLatch等用法
    ETL DAG调度策略
    python2.7 Cheetah You don't have the C version of NameMapper installed
    python threading 用法
    log4j2 Filter用法详解
    ThreadLocal 原理及一些实现
    ETL hive update 之 deltamerge 优化
  • 原文地址:https://www.cnblogs.com/lizhe-Ning/p/12079015.html
Copyright © 2011-2022 走看看