使用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