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