見出し画像

前処理大全:第10章

今回は第10章のコードをまとめて記載します。参考にして頂ければ嬉しいです。
*Pythonのみでのコードになります。

第10章:日時型

10-1:日時型、日付型への変換

Q:日時型、日付型の変換

予約テーブルのreserve_datetimeを日時型と日付型に変換しましょう。また、checkin_dateとcheckin_timeを合わせて日時型に変換し、checkin_dateを日付型に変換しましょう。

# to_dadtetime関数で、datetime64[ns]型に変換
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')
pd.to_datetime(reserve_tb['checkin_date'].str.cat(reserve_tb['checkin_time'], sep=' '), format='%Y-%m-%d %H:%M:%S')

# datetime型64[ns]から日付情報を取得
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S').dt.date
pd.to_datetime(reserve_tb['checkin_date'], format='%Y-%m-%d %H:%M:%S').dt.date

10-2:年/月/日/時刻/分/秒/曜日への変換

Q:各日時要素の取り出し

予約テーブルのrserve_datetimeから、年/月/日/時/分/秒を取り出しましょう。また、年-月-日 時:分:秒の文字列に変換しましょう

# reserve_datetimeをdatetime64[ns]型に変換
reserve_tb['reserve_datetime'] = pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')

# 年を取得
reserve_tb['reserve_datetime'].dt.year

# 月を取得
reserve_tb['reserve_datetime'].dt.month

# 日を取得
reserve_tb['reserve_datetime'].dt.day

# 曜日(0=日曜日、1=月曜日)を数値で取得
reserve_tb['reserve_datetime'].dt.dayofweek

# 時刻の時を取得
reserve_tb['reserve_datetime'].dt.hour

# 時刻の分を取得
reserve_tb['reserve_datetime'].dt.minute

# 時刻の秒を取得
reserve_tb['reserve_datetime'].dt.second

# 指定したフォーマットの文字列に変換
reserve_tb['reserve_datetime'].dt.strftime('%Y-%m-%d %H:%M:%S')

10-3:日時差への変換

Q:日時差の計算

予約テーブルの予約日時とチェックインの日時の差分を計算しましょう

# reserve_datetimeをdatetime64[ns]型に変換
reserve_tb['reserve_datetime'] = pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')

# checkin_datetimeをdatetime64[ns]型に変換
reserve_tb['checkin_datetime'] = pd.to_datetime(reserve_tb['checkin_date'].str.cat(reserve_tb['checkin_time'], sep=' '), format='%Y-%m-%d %H:%M:%S')

# 年の差分を取得(付き以下の日時要素は考慮しない)
reserve_tb['reserve_datetime'].dt.year - reserve_tb['checkin_datetime'].dt.year

# 月の差分を取得
(reserve_tb['reserve_datetime'].dt.year * 12 +
  reserve_tb['reserve_datetime'].dt.month) -
(reserve_tb['checkin_datetime'].dt.year * 12 +
  reserve_tb['checkin_datetime'].dt.month)

# 日単位で差分を計算
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']).astype('timedelta64[D]')

# 時単位で差分を計算
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']).astype('timedelta64[h]')

# 分単位で差分を計算
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']).astype('timedelta64[m]')

# 秒単位で差分を計算
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']).astype('timedelta64[s]')

10-4:日時型の増減

Q:日時型の増減処理

予約テーブルの予約日時に1日間/1時間/1分間/1秒間を加えましょう

# timedelta用にdatetimeライブラリを読み込み
import datetime

# reserve_datetimeをdatetime64[ns]型に変換
reserve_tb['reserve_datetime'] = pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')

# reserve_datetimeからdateを抽出
reserve_tb['reserve_date'] = reserve_tb['reserve_datetime'].dt.date

# reserve_datetimeに1日を加える
reserve_tb['reserve_datetime'] + datetime.timedelta(days=1)

# reserve_dateに1日を加える
reserve_tb['reserve_date'] + datetime.timedelta(days=1)

# reserve_datetimeに1日を加える
reserve_tb['reserve_datetime'] + datetime.timedelta(hours=1)

# reserve_datetimeに1分を加える
reserve_tb['reserve_datetime'] + datetime.timedelta(minutes=1)

# reserve_datetimeに1秒を加える
reserve_tb['reserve_datetime'] + datetime.timedelta(seconds=1)

10-5季節への変換

Q:季節に変換

予約テーブルのreserve_datetimeの月から、予約時の季節のデータを生成しましょう。3~5は春、6~8は夏、9~11は秋、12~2は冬とします。

# reserve_datetimeをdatetime64[ns]型に変換
reserve_tb['reserve_datetime'] = pd.to_datetime(
    reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')

# 月の数字を季節に変換する関数
def to_season(month_num):
    season = 'winter'
    if 3 <= month_num <= 5:
        season = 'spring'
    elif 6 <= month_num <= 8:
        season = 'summer'
    elif 9 <= month_num <= 11:
        season = 'autumn'
        
    return season

# 季節に変換
reserve_tb['reserve_season'] = pd.Categorical(
    reserve_tb['reserve_datetime'].dt.month.apply(to_season),
    categories=['spring', 'summer', 'sutumn', 'winter']
)
reserve_tb.head()

10-7:平日/休日への変換

Q:休日フラグの付与

予約テーブルのcheckin_dateに対して休日マスタ(休日フラグ、休前日フラグ)を付与しましょう。

holiday_mst_tb = pd.read_csv('holiday_mst.csv', encoding='UTF-8')

# 休日マスタと結合
pd.merge(reserve_tb, holiday_mst_tb, left_on='checkin_date', right_on='target_day')


いいなと思ったら応援しよう!

伊藤 信之介
サポートして頂いたお金は開業資金に充てさせて頂きます。 目標は自転車好きが集まる場所を作る事です。 お気持ち程度でいいのでサポートお願い致します!