目录
4 延伸,使用 xlrd 读取excel时出现数字的解决方法
记录一下最近碰到的一个小问题。
1 问题描述
目标:使用Django从Excel中读取数据,写入数据库。
出现的问题:Excel里面有几列是时间,大致格式为xxxx年xx月xx日,当用panda读取到那列数据时,得到的是一串数字(浮点数)。
该列数据对应到Django model中的Class属性类型是Date和Datetime。
2 解决方案
def date(para):
delta = pd.Timedelta(str(para)+'days')
time = pd.to_datetime('1899-12-30') + delta
return time
使用上述的函数,将得到的数据(float类型)传入。示例如下:
3 后续解决措施
经过上面的处理,得到的 Timestamp('2017-06-23 00:00:00') 还没有办法直接导入数据库,我的做法是先将其转换为字符串,得到 '2017-06-23 00:00:00' 然后将该字符串转换为时间,大致写法如下:
import datetime
str_p = str(date(42909))
dateTime_p = datetime.datetime.strptime(str_p,'%Y-%m-%d %H:%M:%S')
然后就可以将其导入数据库。
但是,在此之间又出现了一个警告错误,经过查询,是Django的时区设置的问题,在setting文件中进行修改相应的时区配置,如下:
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
此时调用时间即为中国的时间。
4 延伸,使用 xlrd 读取excel时出现数字的解决方法
代码如下:
import xlrd
from xlrd import xldate_as_tuple
from datetime import datetime
date = datetime(*xldate_as_tuple(42909.646157, 0))
# date = datetime.datetime(2017, 6, 23, 15, 30, 28)
xldate_as_tuple 函数定义:
def xldate_as_tuple(xldate, datemode)
参数一:要处理的单元格值
参数二:时间基准(0代表以1900-01-01为基准,1代表以1904-01-01为基准)
返回值:返回一个元组,他的值类似于(year, month, day, hour, minute, nearest_second)
5 参考文章
pandas 读excel,日期变成了数字,pandas方法解决_RogerFedereYY的博客-CSDN博客
python读取excel,数字都是浮点型,日期格式是数字的解决办法 - 夜雨西风 - 博客园 (cnblogs.com)