使用xlrd读取出来的时间字段是类似41410.5083333的浮点数,在使用时需要转换成对应的datetime类型,下面代码是转换的方法:
首先需要引入xldate_as_tuple函数:
- from xlrd import xldate_as_tuple
- #d是从excel中读取出来的浮点数
- xldate_as_tuple(d,0)
xldate_as_tuple第二个参数有两种取值,0或者1,0是以1900-01-01为基准的日期,而1是1904-01-01为基准的日期。该函数返回的是一个元组,他的值类似:(year, month, day, hour, minute, nearest_second)
例子:
excel中E2单元格值为2018/05/27
- from xlrd import xldate_as_tuple
- result = xldate_as_tuple(ws['E2'].value,0)
- print(result) # 结果(2018, 5, 27, 0, 0, 0)
- from xlrd import xldate_as_tuple
- result = xldate_as_tuple(ws.cell(row=2,column=5).value,0)
- print(result) # 结果(2018, 5, 27, 0, 0, 0)
注意:该例子没有对第一行的数据进行处理。第一行数据作为key,其它行作为value,依次返回每行数据。
- import xlrd
- from datetime import datetime
- from xlrd import xldate_as_tuple
-
-
- def get_excel_data(file): # 传入文件路径字符串即可,例如:get_excel_data('account.xlsx')
- workbook = xlrd.open_workbook(file)
- sheet = workbook.sheets()[0] # 读取第一个sheet
- nrows = sheet.nrows # 行数
- first_row_values = sheet.row_values(0) # 第一行数据
- list = []
- num = 1
- for row_num in range(1, nrows):
- row_values = sheet.row_values(row_num)
- if row_values:
- str_obj = {}
- for i in range(len(first_row_values)):
- ctype = sheet.cell(num, i).ctype
- cell = sheet.cell_value(num, i)
- if ctype == 2 and cell % 1 == 0.0: # ctype为2且为浮点
- cell = int(cell) # 浮点转成整型
- cell = str(cell) # 转成整型后再转成字符串,如果想要整型就去掉该行
- # 这个代表表格中是日期类型
- elif ctype == 3:
- date = datetime(*xldate_as_tuple(cell, 0))
- cell = date.strftime('%Y/%m/%d %H:%M:%S')
- elif ctype == 4:
- cell = True if cell == 1 else False
- str_obj[first_row_values[i]] = cell
- list.append(str_obj)
- num = num + 1
- return list
-