1900/1/1 を起点とするEXCELのDateシリアル値をPython Datetime に変換する関数です。 オリジナルデータdf で使われていたEXCEL Dateシリアル値をpandasデータフレームで正しく表示させます。定番のデータハンドリングです。
チートシート
やりたいこと | 注意点 |
---|---|
EXCEL Dateシリアル値をDatetimeに変換する | df['d'] = df['s'].apply(関数名) 関数をapplyする |
今回使うデータのポイント
- df.shape => 17879 x 1
- Serial_Date とある列が変換対象のEXCEL Dateシリアル値です
- 関数2つでDate1,Date2の2列を追加します
オリジナルデータdf のEXCEL シリアルDate値を抜き出して検証しました。
サンプルコーディング
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 関数名 excel2datetimme, 引数はet, 列Date1を追加
def excel2datetime(et):
if et < 60:
days = pd.to_timedelta(et - 1, unit='days')
else:
days = pd.to_timedelta(et - 2, unit='days')
return pd.to_datetime('1900/1/1') + days
df['Date1'] = df['Serial_Date'].apply(excel2datetime)
# ---------------------
# 関数名 excel2date, 引数はet2, 列Date2を追加
def excel2date(et2):
from datetime import datetime, timedelta
return(datetime(1899, 12, 30) + timedelta(days=et2))
df['Date2'] = df['Serial_Date'].apply(excel2date)
結果は以下のとおりです 今回使用したデータでは両者とも同じ結果を返しました。
計算結果のデータフレーム
おまけ
strptimeの’%d/%m/%Y’の記法に関するメモ も併せて参考にしてください!
定義した関数に直接直近のうるう年のシリアル値を入れて、確認してみました。大丈夫そうですね。
ひとこと
前回のブログと同じように、変化のスピードが早い中データ解析に求められるのも、新鮮なデータでの解析です。リアルタイムにビッグデータを解析するのが当たり前な時代です。datetime handling 基礎です。