生年月日から年齢を計算をします。文字列MM/DD/YYで年が二桁しかありません。 Kaggleでみつけた2016年リオデジャネイロオリンピックの選手リストを使って、Pandas で計算します。

サンプルデータセットについてにデータセットの概要があります。参考にしてください。


チートシート

やりたいこと 注意点
生年月日を計算下準備 df['dob'] = pd.to_datetime(df['dob'])でオブジェクトにすること
MM/DD/YYの対応 1/1/68 が2068-01-01になってしまうので、計算を分けること

Kaggle データで作成する

リオデータ を使って、生年月日を計算しました。 生年月日がMM/DD/YYと年が二桁であること。 データに欠損値があるので、必ず、その行を落とすなどして下準備をする必要があります。 Kaggle で RIO, Olympic と検索すると出てくると思います・

今回使うデータのポイント

  1. df.shape => 11538 x 11
  2. dob とある列が生年月日です
  3. 2016/07/01 時点の年齢としました

df.shape

サンプルコーディング

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 下準備として文字列からオブジェクトにしておく
df["DoB"] = pd.to_datetime(df["dob"], format="%m/%d/%y")

# 年齢を計算する

def getAge(DoB):
    today    = int(pd.to_datetime('2016-07-01').strftime('%Y%m%d'))
    DoB = int(DoB.strftime('%Y%m%d'))
    return int((today - DoB) / 10000)

df['age'] = df['DoB'].apply(lambda x: getAge(x))
df.head()

# もしくは以下でも同じこと

now = pd.to_datetime('2016/07/01')
df['age']=(now.year - df['DoB'].dt.year) - ((now.month - df['DoB'].dt.month) < 0)

結果は以下のとおりです YYYY-MM-DD の形式のDoB 列を作成しその列に対してlambda関数で生年月日を計算しました。

計算結果のデータフレーム

result


おまけ

よろしかったら、strptimeについての記事 も参考にしてください!

密度関数のグラフ化もして分布の状況をみてみました。

密度関数


ひとこと

データ解析に日付データは欠かせません。変化のスピードが早い中データ解析に求められるのも、新鮮なデータでの解析です。したがって、「いつのデータを元にしたか」で信頼性が大きく変わってきます。そのベースがdatetime handling です。