web-dev-qa-db-ja.com

pandasでExcelスタイルの日付を変換する

Excelスタイルで日時を提供するxmlファイルを解析する必要があります。例えば: 42580.3333333333

Pandasは、その数を通常のdatetimeオブジェクトに変換する方法を提供しますか?

12
st4rbuck

OK最も簡単なのは、floatから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

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

関連項目を参照: python datetime.datetimeをExcelシリアル日付番号に変換する方法

11
EdChum

pd.to_datetime に渡す前に、サードパーティの xlrd ライブラリを使用できます。

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
5
jpp