IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

xlrd 读取 xls (excel)的日期、时间单元格的问题

" 人可 2011-09-19 23:46:17 累计浏览 2,550 次
本机暂存

    xlrd 是python 的xls处理扩展包,常用来读取xls文件:

    遇到的问题:

    1. 解析日期2005-7-8这样的单元格后,print 出来的是整数:38541

    2. 解析日期12:35:00这样的单元格,print出来时浮点数:0.524305555556

    处理日期和时间就卡住了,转换起来也很麻烦,因为在xls内部就是按照长整型和浮点数来存储日期和时间的。搜索后发现很多人都碰到这个问题:

limodou 自己去写了计算方法:

    使用xlrd模块时对Excel的日期处理

    思路确实是把整形转化成datetime对象即可。

    解决方式:

    其实xlrd本身就带有这个功能了,在xlrd的example里面就有。

    xlrd.xldate_as_tuple(cell_value, 0)

    @param datemode 0: 1900-based, 1: 1904-based.

    其中cell_value是单元格的值,如何读取就省略了先。

    这样12:35:00格式的时间久可以转化成:(0, 0, 0, 12, 35, 0)

    datetime读取这个tuple就好。

    再附上转化时间的源码:

def xldate_as_tuple(xldate, datemode):
    if datemode not in (0, 1):
        raise XLDateBadDatemode(datemode)
    if xldate == 0.00:
        return (0, 0, 0, 0, 0, 0)
    if xldate < 0.00:
        raise XLDateNegative(xldate)
    xldays = int(xldate)
    frac = xldate - xldays
    seconds = int(round(frac * 86400.0))
    assert 0 <= seconds <= 86400     if seconds == 86400:         hour = minute = second = 0          xldays += 1     else:         # second = seconds % 60; minutes = seconds // 60         minutes, second = divmod(seconds, 60)          # minute = minutes % 60; hour    = minutes // 60         hour, minute = divmod(minutes, 60)      if xldays >= _XLDAYS_TOO_LARGE[datemode]:
        raise XLDateTooLarge(xldate)

    if xldays == 0:
        return (0, 0, 0, hour, minute, second)

    if xldays < 61 and datemode == 0:         raise XLDateAmbiguous(xldate)     jdn = xldays + _JDN_delta[datemode]     yreg = (ifd(ifd(jdn * 4 + 274277, 146097) * 3, 4) + jdn + 1363) * 4 + 3      mp = ifd(yreg % 1461, 4) * 535 + 333      d = ifd(mp % 16384, 535) + 1      # mp /= 16384     mp >>= 14
    if mp >= 10:
        return (ifd(yreg, 1461) - 4715, mp - 9, d, hour, minute, second)
    else:
        return (ifd(yreg, 1461) - 4716, mp + 3, d, hour, minute, second)

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,251)
  2. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,164)
  3. 神马?用excel来做项目管理? (累计阅读 43,289)
  4. 程序员技术练级攻略 (累计阅读 35,471)
  5. python实现自动登录discuz论坛 (累计阅读 32,834)
  6. python编程细节──遍历dict的两种方法比较 (累计阅读 20,371)
  7. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,918)
  8. Chrome和goagent的配置方法,你懂的 (累计阅读 16,843)
  9. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,742)
  10. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,302)