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

时间:2015-04-01 09:24:54

标签: python excel python-2.7 date

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

5 个答案:

答案 0 :(得分:16)

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

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)

您必须在1900/02/28之后的任何日期调整一天的序数; Excel从Lotus 1-2-3继承了leap year bug并将1900视为闰年。上面的代码会为datetime(1900, 2, 28, 0, 0)59返回60来纠正此问题。

上面也支持一系列表示时间的连续剧,但由于Excel不支持微秒,因此会删除。

答案 1 :(得分:3)

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)

上述答案仅适用于日期值,但在此我将上述解决方案扩展为包含时间并返回日期时间值。

答案 2 :(得分:0)

我将推荐以下内容:

import pandas as pd

def convert_excel_time(excel_time):

    return pd.to_datetime('1900-01-01') + pd.to_timedelta(excel_time,'D')

import datetime

def xldate_to_datetime(xldate):
    temp = datetime.datetime(1900, 1, 1)
    delta = datetime.timedelta(days=xldate)
    return temp+delta

取自 https://gist.github.com/oag335/9959241

答案 3 :(得分:0)

在尝试执行上述操作时,我遇到了这个问题,但对于df中的整个列。我做了这个功能,对我有用:

import pandas as pd    
from datetime import datetime, timedelta
import copy as cp

def xlDateConv(df, *cols):      
    tempDt = []
    fin = cp.deepcopy(df)
    for col in [*cols]:
        for i in range(len(fin[col])):
            tempDate = datetime(1900, 1, 1)
            delta = timedelta(float(fin[col][i]))
            tempDt.append(pd.to_datetime(tempDate+delta))

        fin[col] = tempDt
        tempDt = []
    return fin

请注意,您需要将每个用引号括起来(作为字符串)的列作为一个参数输入,这很可能会得到改进(例如,将列列表作为输入)。另外,它会返回原始df的副本(不会更改原始df)。

顺便说一句,部分受此(https://gist.github.com/oag335/9959241)启发。

答案 4 :(得分:0)

如果您正在使用熊猫,这可能会有用

    import xlrd
    import datetime as dt
    
    def from_excel_datetime(x):
        return dt.datetime(*xlrd.xldate_as_tuple(x, datemode=0))
    
    df['date'] = df.excel_date.map(from_excel_datetime)

如果日期似乎延迟了4年,也许您可​​以尝试使用datemode 1。

:参数日期模式: 0:基于1900; 1:基于1904。