前処理大全:第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')
いいなと思ったら応援しよう!
サポートして頂いたお金は開業資金に充てさせて頂きます。
目標は自転車好きが集まる場所を作る事です。
お気持ち程度でいいのでサポートお願い致します!