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

时间:2009-07-10 08:41:45

标签: python excel datetime

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

14 个答案:

答案 0 :(得分:65)

您可以使用xlrd

documentation开始,您可以看到日期始终存储为数字;但是,您可以使用xldate_as_tuple将其转换为python日期。

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

答案 1 :(得分:25)

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

##
# 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)
        )

答案 2 :(得分:23)

以下是无风险使用风险版本:

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)
        )

答案 3 :(得分:20)

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)

答案 4 :(得分:5)

请参阅此链接:Reading date as a string not float from excel using python xlrd

它对我有用:

在镜头中这个链接有:

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

答案 5 :(得分:2)

预期情况

# Wrong output from cell_values()
42884.0

# Expected output
2017-5-29

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

获取所需的变量如下

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

sheet = workbook.sheet_by_index(0)

wrongValue = sheet.cell_value(2,2)

并使用 xldate_as_tuple

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

那是我的解决方案

答案 6 :(得分:1)

如果您正在使用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]')

答案 7 :(得分:1)

excel将日期和时间存储为代表自1900年1月0日以来的天数的数字,如果要使用python以日期格式获取日期,只需从days列中减去2天,如下所示:< / p>

日期= sheet.cell(1,0).value-2 //在python中

在Excel的第1列中,我有我的date及以上命令,为我提供了减去两天的日期值,这与我的excel工作表中的日期相同

答案 8 :(得分:0)

快速而肮脏:

year, month, day, hour, minute, second = xlrd.xldate_as_tuple(excelDate, wb.datemode)
whatYouWant = str(month)+'/'+str(day)+'/'+str(year)

答案 9 :(得分:0)

人们的帖子组合给了我excel转换的日期和时间。我把它作为一个字符串

返回
def xldate_to_datetime(xldate):
  tempDate = datetime.datetime(1900, 1, 1)
  deltaDays = datetime.timedelta(days=int(xldate))
  secs = (int((xldate%1)*86400)-60)
  detlaSeconds = datetime.timedelta(seconds=secs)
  TheTime = (tempDate + deltaDays + detlaSeconds )
  return TheTime.strftime("%Y-%m-%d %H:%M:%S")

答案 10 :(得分:0)

由于您的excel文件有可能来自不同的计算机/人;格式可能会杂乱无章;所以要格外小心。

我只是从50个奇数个Excel中导入了数据,这些数据在DD/MM/YYYYDD-MM-YYYY中被输入了,但是大多数Excel文件被存储了它们作为MM/DD/YYYY(可能是因为PC是用en-us而不是en-gben-in设置的)。

更令人烦恼的是,13/MM/YYYY以上的日期仍为DD/MM/YYYY格式。因此,Excel文件中存在差异。

我发现的最可靠的解决方案是将每个excel文件上的“日期”列手动设置为纯文本-然后使用以下代码对其进行解析:

if date_str_from_excel:
    try:
        return datetime.strptime(date_str_from_excel, '%d/%m/%Y')
    except ValueError:
        print("Unable to parse date")

答案 11 :(得分:0)

这是@hounded的修订版本。我的代码同时处理日期和时间,例如43705.591795706

data.table

答案 12 :(得分:0)

如果Excel文件中有datetime列。然后下面的代码将修复它。我在StackOverflow上经历了很多答案,但没有任何解决办法。我以为文件已损坏。

from datetime import datetime
jsts = 1468629431.0
datetime.fromtimestamp(jsts) 

答案 13 :(得分:-1)

将excel文件转换为CSV时,日期/时间单元格如下所示:

foo,3/16/2016 10:38,bar,

要将datetime文本值转换为datetime python对象,请执行以下操作:

from datetime import datetime

date_object = datetime.strptime('3/16/2016 10:38', '%m/%d/%Y %H:%M')    # excel format (CSV file)

print date_object将返回2005-06-01 13:33:00