Python数据分析基础之Excel(1)

学完了CSV文件,终于到了Excel,以前也接触过Excel,但仅限于做一些简单的表格,这一章开始学用Python来操作Excel文件。但与csv模块不同,Python中没有处理Excel文件(就是带有.xls和.xlsx扩展名的文件)的标准模块。所以需要xlrd和xlwt的拓展包。他们俩使得Python对Excel时期型数据的支持非常好。
下来开始学习第一部分。

筛选特定行

有些时候,你并不需要Excel文件中的所有行。例如,你可能只需要一个包含特定词或者数值的那些行,或者,你可能只需要那些与一个具体日期相关联的行。在这些情况下,可以使用Python筛选掉不需要的行,只保留需要的行。

1.行中的值满足某个条件

1 #!/usr/bin/env python3
2 import sys
3 from datetime import date
4 from xlrd import open_workbook, xldate_as_tuple
5 from xlwt import Workbook
6
7 input_file = sys.argv[1]
8 output_file = sys.argv[2]
9
10 output_workbook = Workbook()
11 output_worksheet = output_workbook.add_sheet('jan_2013_output')
12
13 sale_amount_column_index = 3
14 with open_workbook(input_file) as workbook:
15		worksheet = workbook.sheet_by_name('january_2013')
16		data = []
17		header = worksheet.row_values(0)
18		data.append(header)
19		for row_index in range(1,worksheet.nrows):
20			row_list = []
21			sale_amount = worksheet.cell_value(row_index, 
22 			sale_amount_column_index)
23			if sale_amount > 1400.0:
24				for column_index in range(worksheet.ncols):
25					cell_value = 
26 					worksheet.cell_value(row_index,column_index)
27					cell_type = worksheet.cell_type(row_index, 
28 					column_index)
29					if cell_type == 3:
30						date_cell =
31 					xldate_as_tuple(cell_value,workbook.datemode)
32						date_cell =
33 					date(*date_cell[0:3]).strftime('%m/%d/%Y')
34						row_list.append(date_cell)
35					else:
36						row_list.append(cell_value)
37				if row_list:
38					data.append(row_list)
39
40	for list_index, output_list in enumerate(data):
41		for element_index, element in enumerate(output_list):
42			output_worksheet.write(list_index, element_index, element)
43
44 output_workbook.save(output_file)

解释一下代码:
第三行:datetime模块导入date函数,以使我们可以将数值转换为日期并对日期进行格式化。

第四行:从xlrd模块导入了两个函数,open_workbook函数是用来读取和分析Excel文件,而xldate_as_tuple函数可以将Excel中代表日期,时间或日期时间的数值转换为元组。只要将数值转换为元组,就可以提取出具体时间(例如:年,月,日)并将时间元素格式化成不同的时间格式(例如:1/1/2010或January 1,2010)。

第十行:实例化一个wlxt Workbook对象,以使我们可以将结果写入用于输出的Excel文件。

第十一行:使用xlwt的add_sheet函数为输出工作簿添加一个工作表jan_2013_output。

第十四行:使用xlrd的open_workbook函数打开用于输入的工作簿,并将结果赋给一个workbook对象。

第十五行:使用这个workbook对象的sheet_by_name函数引用名称为January_2013的工作表。

第十六行:创建了一个空列表data。我们将用输入文件中要写入输出文件中的那些行来补充这个列表。

第十七行:提取出标题行中的值。因为我们想保留标题行,而且检验这一行是否满足筛选条件没有意义,所以第十八行代码将标题行直接追加到data中。

第二十一行:创建了一个变量sale_amount,用来保存行中的销售额。cell_value函数使用的是sale_amount_column_index中的值来定位Sale Amount列,因为我们想保留销售额大于¥1400.00的哪些行,所以要使用这个变量作为检验条件。

第二十四行:创建for循环,来处理Sale Amount大于1400.0的那些行。对于这些行,我们先提取出每个单元格的值,赋给变量cell_value,再提取出每个单元格的类型,赋给变量cell_type,然后,检验行中的每个值是否是日期类型。如果是日期类型,那么就将这个值格式化成日期数据。为了生成一个每个值都正确格式化的行,又创建了一个空列表row_list。

第三十七行:我们为输入文件的每一行都创建空列表row_list,但是只使用值填充某些空列表(就是Sale Amount这列的值大于1400.0的那些行的空列表)。所以,对于输入文件的每一行,检验row_list是否为空,只将非空的row_list添加到data中。

在最后:我们在data中的各个列表之间和列表中的各个值之间进行迭代,将这些值写入输出文件。将要保留的行追加到一个新列表data中的主要原因是,这样可以得到新的连续的行索引值。于是,当我们将这些行写入输出文件时,他们看上去就像是一个连续的整体,行与行之间不会出现缺口。

补充:
如果你需要设定多个条件,那么可以将这些条件放在圆括号中,根据需要的逻辑顺序符用“|”或“&”连接起来。

这就是Excel筛选特定行,很抽象,很难懂。。。。。。。。。继续努力吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值