日付データはデータ型の取り扱いが面倒ですが、様々な特徴量を作ることができます。
今回はPandasでの日付データの加工、時系列データの特徴量作成についてご紹介します。
データ型の変換
データ取り込み時に日付を文字列として読み込んだ場合などデータ型の変換
from datetime import datetime
from datetime import timedelta
#文字列の日付をdatetime型に変換
df['Date_datetime'] = pd.to_datetime(df['Date_str'])
#timedelta型をintに変換
delta_int = df['Date_timedelta'].dt.days
特徴量の作成
日付を作る
特定の日時のデータを作る場合、datetimeで設定する
year, month, day, hour, minute, second, microsecondの値入力、年/月/日以降は任意入力
datetime = datetime(2022, 12, 10, 8, 0, 0)
現在の時刻を取得する場合、「.now()」で取得できる
datetime.now()
# datetime.datetime(2023, 6, 17, 12, 16, 57, 314015)
日付を変換する
日付から年月日、曜日などを抽出する
LightGBMなどではdatetime型、object型の特徴量は利用できないためint型もしくはfloat型に変換する必要がある
df['Month'] = df['Date_datetime'].dt.month
df['Day'] = df['Date_datetime'].dt.day
df['Weekday'] = df['Date_datetime'].dt.day_name()
#weekdayが文字列のためone-hotエンコーディング
df = pd.get_dummies(df, drop_first=True, prefix='', prefix_sep='', columns=['Weekday'])
日時データを日付にまるめる、日付部分だけ抽出する
Pandasの日時データの日付部分だけを抽出する場合、.dt.floor(‘D’)で実現する
df['Date_datetime'].dt.floor('D') #日付部分だけ抽出、時分秒を切り捨て
timedelta
日付の差分、日付を○日分前倒し/後ろ倒しなどtimedeltaを使ったデータ変換
日付と日付の差分を求める
datetime型同士の引き算で差分を計算できる。ただし、引き算の結果はtimedelta型となっており元のdatetime型や数値とはことなるため、実際の学習などに用いる際は差分を数値に変換する必要がある
#日付の差分を計算する
df['delta'] = df['Date_datetime1'] - df['Date_datetime2']
#日付の差分をintに変換
delta_int = df['delta'].dt.days
最も若い日付からの累積日数を算出する
同じくtimedeltaを用いて、対象行の日付とその最小値の差分を求める
df['DAYS'] = (df['Date_datetime'] - df['Date_datetime'].min()).dt.days
日付の前倒し、後ろ倒し
#1日前倒し
df['Date-1d'] = df['Date_datetime'] - datetime.timedelta(days=1)
#3日前倒し
df['Date-3d'] = df['Date_datetime'] - datetime.timedelta(days=3)
#1日後ろ倒し
df['Date+3d'] = df['Date_datetime'] + datetime.timedelta(days=1)
datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, seconds=0, microseconds=0, milliseconds=0)
weeks, days, hours, minutes, second, microseconds, millisecondsと移動させたい単位を設定できる
月/年単位での移動はtimedeltaでサポートされておらず、「relativedelta」にて対応が必要。
また、pandasのDataFrameの場合はlambda関数を使っての処理が必要となる
from dateutil.relativedelta import relativedelta
##pythonの値の場合
# 1ヶ月前/後
Datetime_plus_1month = datetime + relativedelta(months=1)
Datetime_minus_1month = datetime + relativedelta(months=-1)
# 1年前/後
Datetime_plus_1year = datetime + relativedelta(years=1)
Datetime_minus_1year = datetime + relativedelta(years=-1)
##pandasのDataFrameの場合
# 1ヶ月後
df['Date-1d'] = df['Date_datetime'].apply(lambda x : x + relativedelta(months=1)))