zoukankan      html  css  js  c++  java
  • [django]django xlrd处理xls中日期转换问题

    xlrd会把xls文件中比如20160--03-01类型的时间转换成整数,那么我们如何保证xlrd读取进来的时间为2016-03-01格式呢?

    使用xlrd中的xldate_as_tuple函数

    代码如下:

    from datetime import datetime

    from xlrd import xldate_as_tuple


    datetime(*xldate_as_tuple(table.cell(2,2).value,0))
    str(datetime(*xldate_as_tuple(table.cell(2,2).value,0)))[0:10]#取字符串的前十,例如结果为2016-06-01 00:00:00 则为2016-06-01

    完整导入数据代码:

    #coding:utf-8 
    
    import os 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.settings") 
    
    '''
    Django 版本大于等于1.7的时候,需要加上下面两句
    import django
    django.setup()
    否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
    '''
    import django
    
    if django.VERSION >= (1, 7):#自动判断版本
        django.setup()
    
    from contract.models import Bill
    import xlrd #excel读工具
    from datetime import datetime
    from xlrd import xldate_as_tuple
    
    data= xlrd.open_workbook('DEMO.xlsx') #打开文件
    table = data.sheet_by_index(0) #获取工作表
    nrows = table.nrows #行数
    ncols = table.ncols #列数
    colnames =  table.row_values(0)
    WorkList = []
    x = y = z = 0
    for i in range(1,nrows):
        row = table.row_values(i) #获取每行值
        for j in range(0,ncols):
            if type(row[j]) == float: #如果值为float则转换为int,避免出现1输出为1.0的情况
                row[j] = int(row[j])
        if row: #查看行值是否为空
            if Bill.objects.filter(contract_code = row[0]).exists():#判断该行值是否在数据库中重复
                x = x + 1 #重复值计数
            else:
                y = y + 1 #非重复计数
                row[3] = str(datetime(*xldate_as_tuple(row[3],0)))[0:10]#xlrd读取xls文件时间整数值转换为date形式
                row[4] = str(datetime(*xldate_as_tuple(row[4],0)))[0:10]
                row[5] = str(datetime(*xldate_as_tuple(row[5],0)))[0:10]
                WorkList.append(Bill(contract_code=row[0], contract_name=row[1], cust_name=row[2], con_sign_date=row[3],
                                                 con_eff_date=row[4], con_exp_date=row[5],con_state=row[6], con_age=row[7],
                                                 con_type=row[8], con_agent=row[9],new_flag=row[10],original_code=row[11],payment=row[12]
                                    )
                                )
        else:
            z = z + 1     #空行值计数
    Bill.objects.bulk_create(WorkList)
    print '数据导入成功,导入'+str(x)+'条,重复'+str(y)+'条,有'+str(z)+'行为空!'
  • 相关阅读:
    小酌一下:pipenv 基本用法
    sql2008使用您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
    Join操作基本:外连接、自然连接、内连接
    用dataReader获取datetime类型完整精度的时间字串
    c# MesageBox
    判断当前时间是否在一个时间段内
    c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段
    sql Convert函数
    c# MD5方法总结
    wml跳转
  • 原文地址:https://www.cnblogs.com/CQ-LQJ/p/5344319.html
Copyright © 2011-2022 走看看