如何将给定的序号(从Excel)转换为日期

Kri*_*ish 22 python excel date python-2.7

我有一个值38142我需要使用python将其转换为日期格式.如果在excel中使用此数字并在此时右键单击并格式化单元格,则该值将转换为04/06/2004,并且我需要使用python获得相同的结果.我怎样才能做到这一点

Mar*_*ers 24

Excel中的偏移量是自1900/01/01以来的天数,1是1900年1月的第一天,因此将天数添加为1899/12/31的timedelta:

from datetime import datetime, timedelta

def from_excel_ordinal(ordinal, _epoch0=datetime(1899, 12, 31)):
    if ordinal > 59:
        ordinal -= 1  # Excel leap year bug, 1900 is not a leap year!
    return (_epoch0 + timedelta(days=ordinal)).replace(microsecond=0)
Run Code Online (Sandbox Code Playgroud)

对于1900/02/28之后的任何日期,您必须将序数调整一天; Excel继承了Lotus 1-2-3 的闰年错误,将1900年视为闰年.上面的代码返回datetime(1900, 2, 28, 0, 0)两者5960为此纠正.

上面也支持一系列表示时间的连续出版物,但由于Excel不支持微秒,因此会删除它们.

  • @FinanceGuyThatCantCode:“_epoch”参数用于将值缓存为“局部变量”,仅此而已。这有助于避免必须为每个调用创建它,或者必须查找全局(稍慢)。 (2认同)

小智 7

from datetime import datetime, timedelta

def from_excel_ordinal(ordinal, epoch=datetime(1900, 1, 1)):
    # Adapted from above, thanks to @Martijn Pieters 

    if ordinal > 59:
        ordinal -= 1  # Excel leap year bug, 1900 is not a leap year!
    inDays = int(ordinal)
    frac = ordinal - inDays
    inSecs = int(round(frac * 86400.0))

    return epoch + timedelta(days=inDays - 1, seconds=inSecs) # epoch is day 1

excelDT = 42548.75001           # Float representation of 27/06/2016  6:00:01 PM in Excel format  
pyDT = from_excel_ordinal(excelDT)
Run Code Online (Sandbox Code Playgroud)

上面的答案仅适用于日期值,但在这里我扩展了上述解决方案以包括时间并返回日期时间值。