IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python xldr 读取xls 文件中时间格式处理 -> 正文阅读

[Python知识库]Python xldr 读取xls 文件中时间格式处理

前言:个人测试正在入门,今天试着测试去哪儿网站,自己写了一个xls的文件用于存储出发地、目的地、出发时间、返回时间。在读取到返回时间时,在Pycharm运行输出是日期格式成了一个浮点数,我开始以为是读取成了格林尼治时间,预估是时间间隔。为了验证我试着计算1970年1月1日到出发时间之间的时间间隔,并不符合时间差;太扎心了老铁,这怎么换算咯?几番查阅资料,发现了解决方法,特做记录。

----解决方式,可以直接看第9点----

1、先给您看下我xls文件中的数据:

def read_excel(filename, index, ishead=False):
    xls = xlrd.open_workbook(filename)
    sheet = xls.sheet_by_index(index)
    print("date.today", date.today())
    data = []
    for i in range(sheet.nrows):
        print("----", sheet.row_values(i))
        if i == 0:
            if ishead:
                continue
        data.append(sheet.row_values(i))
    return data

data = read_excel("qunaer.xls", 0, True)

2、看运行输出结果:

3、现在我们来计算一下这两个日期相差的时间间隔,以第一条为例:

4、现在来判断表格中数据的数据类型


def read_excel(filename, index, ishead=False):
    xls = xlrd.open_workbook(filename)
    sheet = xls.sheet_by_index(index)
    print("date.today", date.today())

    # 判断数据类型
    for row in range(sheet.nrows):
        for col in range(sheet.ncols):
            print('--', sheet.cell(row, col), '--type:', sheet.cell(row, col).ctype)

    data = []
    for i in range(sheet.nrows):
        print("----", sheet.row_values(i))
        if i == 0:
            if ishead:
                continue
        data.append(sheet.row_values(i))
    return data

data = read_excel("qunaer.xls", 0, True)

?5、看运行输出结果(只截取了部分,可对比xls表格中前四行数据)

?

?6、那么输出的type对应的数据类型是什么呢?我们到 第44行代码中调用的sheet.cell()中寻找答案-->查看源码

# xlrd.sheet.Cell

class Cell(BaseObject):
    """
    Contains the data for one cell.

    .. warning::
      You don't call this class yourself. You access :class:`Cell` objects
      via methods of the :class:`Sheet` object(s) that you found in the
      :class:`~xlrd.book.Book` object that was returned when you called
      :func:`~xlrd.open_workbook`

    Cell objects have three attributes: ``ctype`` is an int, ``value``
    (which depends on ``ctype``) and ``xf_index``.
    If ``formatting_info`` is not enabled when the workbook is opened,
    ``xf_index`` will be ``None``.

    The following table describes the types of cells and how their values
    are represented in Python.

    .. raw:: html

        <table border="1" cellpadding="7">
        <tr>
        <th>Type symbol</th>
        <th>Type number</th>
        <th>Python value</th>
        </tr>
        <tr>
        <td>XL_CELL_EMPTY</td>
        <td align="center">0</td>
        <td>empty string ''</td>
        </tr>
        <tr>
        <td>XL_CELL_TEXT</td>
        <td align="center">1</td>
        <td>a Unicode string</td>
        </tr>
        <tr>
        <td>XL_CELL_NUMBER</td>
        <td align="center">2</td>
        <td>float</td>
        </tr>
        <tr>
        <td>XL_CELL_DATE</td>
        <td align="center">3</td>
        <td>float</td>
        </tr>
        <tr>
        <td>XL_CELL_BOOLEAN</td>
        <td align="center">4</td>
        <td>int; 1 means TRUE, 0 means FALSE</td>
        </tr>
        <tr>
        <td>XL_CELL_ERROR</td>
        <td align="center">5</td>
        <td>int representing internal Excel codes; for a text representation,
        refer to the supplied dictionary error_text_from_code</td>
        </tr>
        <tr>
        <td>XL_CELL_BLANK</td>
        <td align="center">6</td>
        <td>empty string ''. Note: this type will appear only when
        open_workbook(..., formatting_info=True) is used.</td>
        </tr>
        </table>
    """

    __slots__ = ['ctype', 'value', 'xf_index']

    def __init__(self, ctype, value, xf_index=None):
        self.ctype = ctype
        self.value = value
        self.xf_index = xf_index

    def __repr__(self):
        if self.xf_index is None:
            return "%s:%r" % (ctype_text[self.ctype], self.value)
        else:
            return "%s:%r (XF:%r)" % (ctype_text[self.ctype], self.value, self.xf_index)

7、分析部分源码,查看提示

?8、总结一下我们xls表中出现的数据类型

类型码数据类型Python值
1TextString
2Numberfloat
3Datefloat

也就是说在xls表格中的数据在Python中用xldr读取后,数据类型不完全一致

9、解决方式

import datetime
from xlrd import xldate_as_tuple


def read_excel(filename, index, ishead=False):
    xls = xlrd.open_workbook(filename)
    sheet = xls.sheet_by_index(index)
    print("date.today", date.today())

    # 判断数据类型
    # for row in range(sheet.nrows):
    #     for col in range(sheet.ncols):
    #         print('--', sheet.cell(row, col), '--type:', sheet.cell(row, col).ctype)

    data = []
    for i in range(sheet.nrows):
        data_list_i = []
        if i == 0:
            if ishead:
                continue
        if i > 0:  # 从第2行 第3列开始的date日期类型数据,需要修改的日期只在第3列(2=3-1)
            start_Time_float = sheet.cell(i, 2)
            # 输出获取到的从第二行开始的每个第三列数据的 数据类型 及 数据 及 类型码
            # print("==========", type(start_Time_float), start_Time_float, start_Time_float.ctype)
            # 把获取从第二行开始的每个第三列数据转成我们习惯的日期格式,需要 import datetime 以及 from xlrd import xldate_as_tuple
            start_Time = datetime.datetime(*(xldate_as_tuple(start_Time_float.value, 0)))
            # print("__~~__", start_Time_float.value, type(start_Time_float.value), type(start_Time), start_Time)

            data_list_i = sheet.row_values(i)
            data_list_i[2] = start_Time
            print("---", i, data_list_i[2], data_list_i)

        data.append(data_list_i)

    return data

data = read_excel("qunaer.xls", 0, True)

10、看运行结果

?

11、如果要判断每个单元格的数据类型,修改为日期类型--代码示例:

        nrows = sheet.nrows
        ncols = sheet.ncols

        for row in range(1, nrows):
            for col in range(ncols):
                date_float = sheet.cell(row, col).value
                if sheet.cell(row, col).ctype == 3:
                    date_time = datetime.datetime(*xldate_as_tuple(date_float, 0))
                    print(date_time)

12、仅做记录,感谢您的参考,如果您有建议,不胜感激

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:06:36  更:2022-04-04 12:09:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:26:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码