目录

1 问题描述

2 解决方案

3 后续解决措施

4 延伸,使用 xlrd 读取excel时出现数字的解决方法

5 参考文章


记录一下最近碰到的一个小问题。

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类型)传入。示例如下:

python数字变日期 python将日期转化为数字_解决方案

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)