python基础 实战作业 ---Excel基本读写与数据处理

代码地址如下:
http://www.demodashi.com/demo/11650.html

看完本篇需要:
10min

作业练习需要:
0.5h~3h(依练习者对python熟悉程度而定)

看完本篇可以学到:
1、用xlrd模块读取Excel文件中的数据
2、用xlsxwriter模块向Excel文件写入数据并保存
3、用time和datetime模块将字符串转换成时间类,并进行时间的比较

本篇目录
1. 作业需求
2. 整体思路
3. 详细实现步骤
3.1. 读取表格数据
3.2. 将行数据list按时间先后升序排序
3.3. 维护一个map并新增数据到行数据
3.4. 将修改后的行数据list写入Excel表格并保存为xslx格式
4. 完整代码
5. 结果展示
6. 参考
7. 源码及作业练习文件


作业需求

图1.待处理Excel文件
一个朋友在某运动品牌公司上班,老板给他布置了一个处理客户订单数据的任务。要求是根据订单时间和客户id判断生成四个新的数据:
1、记录该客户是第几次光顾
2、上一次的日期时间是什么时候
3、与上次订单的间隔时间
4、这是一个existing客户还是一个new客户(见定义)

文件说明:
1、第一列是订单日期和时间(乱序)
2、第二列是客户的id
3、第三列不需要使用

相关定义如下:
1、existing:此次下单日期时间与上次日期时间的距离在N天以内,精确到时间(时分秒)
2、new:即超过N天

整体思路

**1、读取表格的行数据存储成list,并按照时间列的升序排序。
2、维护一个map(在python里是字典dict),每个用户 id 作为key,一个二元组(第几次下单,上一次的日期时间)作为value。
3、遍历表格行数据的list。判断客户 id 是否已经存在于map中,若首次出现,则置该客户 id 在map中的value为[1,’首次下单’],对应行数据新增的4个数据为[1,’首次下单’,该次日期时间与上次日期时间差,’new’]。若已经存在,则更新map中对应的value为[原次数+1,该次日期时间],对应行数据新增的4个数据为[原次数+1,上次日期时间,间隔时间,new/existing取决于间隔时间与预设N]。
4、将修改过后的行数据list写入到Excel工作簿并保存。**

详细实现步骤

读取表格数据

我们可以用xlrd模块对Excel文件进行读取,以便进一步分析处理数据。示例代码如下:

wb=xlrd.open_workbook('../excel/buyer_day.xlsx')# 打开工作簿,参数为文件地址
sheet=wb.sheets()[0]# 获取工作簿中的第一张工作表
for i in range(100):
    if i==0:# 跳过首行的标题
       continue
    time_str= sheet.row_values(i)[0]# 读取该工作表第i行的第一个单元格数据
    print time_str

以上代码成功输出前100行的日期则说明已经成功读取到数据。输出结果如下:

图2.输出示例
可以看到,这里输出的日期前后有空格,而且最后的时间有小数点,这不便于我们转换成时间类,所以要进行一些处理。用strip函数去掉前后空格,用切片切掉末尾的”.0”。将前面的第4行代码更改为:

time_str= sheet.row_values(i)[0].strip()[:-2]

既然读取文件没有问题,进一步浏览整个文件发现存在多余的空行和重复的标题行(如图3),在读取和转存中可以用正则匹配过滤掉这些行。

图3.目标表格中段

另外,可以从图2看出时间是乱序的,这不利于后续的逻辑实现,所以将读取的行数据转存到list中,以便进行排序。

list_row=[]# 将行数据存储到list中,便于排序

wb=xlrd.open_workbook('../excel/buyer_day.xlsx')
sheet=wb.sheets()[0]
nrows=sheet.nrows# 工作表的行数

for i in range(nrows):
    #用正则匹配过滤掉空行和标题行
    str_date=sheet.row_values(i)[0].strip()[:-2]
    if re.match('[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}', str_date)!=None:
        list_row.append(sheet.row_values(i))# 插入到list</
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值