Pandasでの日付/時系列データ処理

※当サイトはアフィリエイト広告を利用しています

データ分析

日付データはデータ型の取り扱いが面倒ですが、様々な特徴量を作ることができます。
今回は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)))

この記事を読んだ人がよく見ています

タイトルとURLをコピーしました