使用pandas转换Excel样式日期

st4*_*uck 11 python excel datetime date pandas

我必须解析一个xml文件,它以Excel样式提供日期时间; 例如:42580.3333333333.

Pandas是否提供了将该数字转换为常规datetime对象的方法?

MrF*_*pes 36

您可以直接使用pd.to_datetime, 关键字unit='D'和进行解析origin='1899-12-30'

import pandas as pd

df = pd.DataFrame({'xldate': [42580.3333333333]})

df['date'] = pd.to_datetime(df['xldate'], unit='D', origin='1899-12-30')

df['date']
Out[2]: 
0   2016-07-29 07:59:59.999971200
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

进一步阅读:


EdC*_*ica 13

好吧我认为最简单的方法是从浮点数构造一个TimedeltaIndex并将其添加到1900,1,1的标量日期时间:

In [85]:
import datetime as dt
import pandas as pd
df = pd.DataFrame({'date':[42580.3333333333, 10023]})
df

Out[85]:
           date
0  42580.333333
1  10023.000000

In [86]:
df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1900,1,1)
df

Out[86]:
           date                  real_date
0  42580.333333 2016-07-31 07:59:59.971200
1  10023.000000 1927-06-12 00:00:00.000000
Run Code Online (Sandbox Code Playgroud)

好吧,看起来excel有点奇怪了它的日期谢谢@ayhan:

In [89]:
df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1899, 12, 30)
df

Out[89]:
           date                  real_date
0  42580.333333 2016-07-29 07:59:59.971200
1  10023.000000 1927-06-10 00:00:00.000000
Run Code Online (Sandbox Code Playgroud)

请参阅相关:如何将python datetime.datetime转换为excel序列日期编号

  • 显然,开始日期应为dt.datetime(1899,12,30).有一天因为Excel的奇怪的00/01/1900表示,而另一天因为这[额外的一天](http://stackoverflow.com/questions/9574793/how-to-convert-a-python-datetime-datetime -to-Excel的串行日期号#comment49502311_9574948) (8认同)

jpp*_*jpp 6

您可以xlrd在传递给之前使用第三方库pd.to_datetime

import xlrd

def read_date(date):
    return xlrd.xldate.xldate_as_datetime(date, 0)

df = pd.DataFrame({'date':[42580.3333333333, 10023]})

df['new'] = pd.to_datetime(df['date'].apply(read_date), errors='coerce')

print(df)

           date                 new
0  42580.333333 2016-07-29 08:00:00
1  10023.000000 1927-06-10 00:00:00
Run Code Online (Sandbox Code Playgroud)