如何在Python中读取Excel格式的日期?

Grz*_*nio 54 python excel datetime

如何将Excel日期(以数字格式)转换为Python中的正确日期?

rob*_*rob 67

你可以使用xlrd.

从其文档中,您可以读到日期始终存储为数字; 但是,您可以使用xldate_as_tuple它将其转换为python日期.

注意:PyPI上的版本似乎比xlrd网站上的版本更新.


Joh*_*hin 26

这是一款无关紧要的无座椅安全带使用风险版本:

import datetime

def minimalist_xldate_as_datetime(xldate, datemode):
    # datemode: 0 for 1900-based, 1 for 1904-based
    return (
        datetime.datetime(1899, 12, 30)
        + datetime.timedelta(days=xldate + 1462 * datemode)
        )
Run Code Online (Sandbox Code Playgroud)

  • 对于基于1900的Excel日期,这将给出1900年3月1日之前Excel日期的错误`datetime`s.这是由于Excel中的错误导致它(错误地)认为1900是闰年.请参阅[Microsoft知识库文章](http://support.microsoft.com/kb/214326) (4认同)
  • 此外,对于非计算机科学般的假设,由于某种原因,1900年的年初开始是1.如果它是中世纪,我们不理解0的概念; 为微软欢呼. (2认同)

Joh*_*hin 25

经过测试和等待反馈的几天后,我将在xlrd的xldate模块中提交以下全新函数...请注意,它仍然不能用于仍在运行Python 2.1或2.2的顽固分子.

##
# Convert an Excel number (presumed to represent a date, a datetime or a time) into
# a Python datetime.datetime
# @param xldate The Excel number
# @param datemode 0: 1900-based, 1: 1904-based.
# <br>WARNING: when using this function to
# interpret the contents of a workbook, you should pass in the Book.datemode
# attribute of that workbook. Whether
# the workbook has ever been anywhere near a Macintosh is irrelevant.
# @return a datetime.datetime object, to the nearest_second.
# <br>Special case: if 0.0 <= xldate < 1.0, it is assumed to represent a time;
# a datetime.time object will be returned.
# <br>Note: 1904-01-01 is not regarded as a valid date in the datemode 1 system; its "serial number"
# is zero.
# @throws XLDateNegative xldate < 0.00
# @throws XLDateAmbiguous The 1900 leap-year problem (datemode == 0 and 1.0 <= xldate < 61.0)
# @throws XLDateTooLarge Gregorian year 10000 or later
# @throws XLDateBadDatemode datemode arg is neither 0 nor 1
# @throws XLDateError Covers the 4 specific errors

def xldate_as_datetime(xldate, datemode):
    if datemode not in (0, 1):
        raise XLDateBadDatemode(datemode)
    if xldate == 0.00:
        return datetime.time(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:
        seconds = 0
        xldays += 1
    if xldays >= _XLDAYS_TOO_LARGE[datemode]:
        raise XLDateTooLarge(xldate)

    if xldays == 0:
        # second = seconds % 60; minutes = seconds // 60
        minutes, second = divmod(seconds, 60)
        # minute = minutes % 60; hour    = minutes // 60
        hour, minute = divmod(minutes, 60)
        return datetime.time(hour, minute, second)

    if xldays < 61 and datemode == 0:
        raise XLDateAmbiguous(xldate)

    return (
        datetime.datetime.fromordinal(xldays + 693594 + 1462 * datemode)
        + datetime.timedelta(seconds=seconds)
        )
Run Code Online (Sandbox Code Playgroud)

  • 嗨@JohnMachin抱歉恢复旧线程,但你做了这件事.我在Ubuntu和python 2.7上,它在我正在使用的版本中不存在. (2认同)
  • `xldate_as_datetime`函数从xlrd版本0.9.3(2014年4月发布到PyPI)添加到`xldate`模块. (2认同)

bea*_*rdc 22

xlrd.xldate_as_tuple很好,但也xlrd.xldate.xldate_as_datetime可以转换为日期时间.

import xlrd
wb = xlrd.open_workbook(filename)
xlrd.xldate.xldate_as_datetime(41889, wb.datemode)
=> datetime.datetime(2014, 9, 7, 0, 0)
Run Code Online (Sandbox Code Playgroud)


Sne*_*mar 6

请参考此链接:使用python xlrd将日期读作字符串而不是从excel中浮动

它对我有用:

在镜头中这个链接有:

import datetime, xlrd
book = xlrd.open_workbook("myfile.xls")
sh = book.sheet_by_index(0)
a1 = sh.cell_value(rowx=0, colx=0)
a1_as_datetime = datetime.datetime(*xlrd.xldate_as_tuple(a1, book.datemode))
print 'datetime: %s' % a1_as_datetime
Run Code Online (Sandbox Code Playgroud)


jet*_*com 5

如果您正在使用 Pandas 并且您的 read_excel 读取格式为 Excel 数字的日期不正确,并且需要恢复后面的真实日期...

lambda function该列用途中应用xlrd恢复追溯到

import xlrd
df['possible_intdate'] = df['possible_intdate'].apply(lambda s: xlrd.xldate.xldate_as_datetime(s, 0))


>> df['possible_intdate']

   dtype('<M8[ns]')
Run Code Online (Sandbox Code Playgroud)


小智 5

预期情况

# Wrong output from cell_values()
42884.0

# Expected output
2017-5-29
Run Code Online (Sandbox Code Playgroud)

示例:让来自工作表编号0 的cell_values(2,2)将作为目标日期

获取所需的变量如下

workbook = xlrd.open_workbook("target.xlsx")

sheet = workbook.sheet_by_index(0)

wrongValue = sheet.cell_value(2,2)
Run Code Online (Sandbox Code Playgroud)

并利用xldate_as_tuple

y, m, d, h, i, s = xlrd.xldate_as_tuple(wrongValue, workbook.datemode)
print("{0} - {1} - {2}".format(y, m, d))
Run Code Online (Sandbox Code Playgroud)

这就是我的解决方案