Pythonを使っていると複数のコードで共通して使用しているコードがあることに気付きます。その作業を完全に覚えていればいいのですが毎回ウェブで調べてコードを記述して、とすると目的の作業は同じなのにシートごとにコード記述方法が違ってしまい見にくくなってしまいます。
そんなことを解消するのが「Pythonチートシート」です。
今回は「 pandas DataFrameで日時をdatetime型に変換して曜日を追加する 」コードを紹介します。
◆ Mac OS
◆ Python 3
◆ JupyterLab
前準備 日付DataFrameの作成
はじめに日付を記載したDataFrameを準備します。以下のコードをコピーして日付表示形式の異なる2つのdfを用意してください。
1 2 3 4 5 |
in_df1 = pd.DataFrame(['2021/11/22','2021/11/23','2021/11/24','2021/11/25','2021/11/26'], columns=['date']) in_df1 in_df2 = pd.DataFrame(['11/22 15:30','11/23 16:00','11/24 9:00','11/25 10:00','11/26 12:30'], columns=['date']) in_df2 |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# in_df1 date 0 2021/11/22 1 2021/11/23 2 2021/11/24 3 2021/11/25 4 2021/11/26 # in_df2 date 0 11/22 15:30 1 11/23 16:00 2 11/24 9:00 3 11/25 10:00 4 11/26 12:30 |
コード: pandas DataFrameで日時をdatetime型に変換して曜日を追加する
それでは実際に「 pandas DataFrameで日時をdatetime型に変換して曜日を追加する 」コードを紹介します。この作業を行うには「datetimeモジュール」を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Ex.1) in_df1の場合 from datetime import datetime import calendar # 空リスト作成 date_list=[] week_name_list=[] for i in in_df1['date']: # datetimeオブジェクトの作成 date = datetime.strptime(i, '%Y/%m/%d') date_list.append(date) # 曜日の作成 week_name_date = date.strftime('%A') week_name_list.append(week_name_date) # dfの生成 date_df = pd.DataFrame(d_list, columns=['datetime']) week_name_df = pd.DataFrame(week_name_list, columns=['week_name']) # dfの結合 out_df1 = pd.concat([in_df1, date_df, week_name_df], axis=1) out_df1 |
出力結果
1 2 3 4 5 6 |
date datetime week_name 0 2021/11/22 2021-11-22 Monday 1 2021/11/23 2021-11-23 Tuesday 2 2021/11/24 2021-11-24 Wednesday 3 2021/11/25 2021-11-25 Thursday 4 2021/11/26 2021-11-26 Friday |
上記のコードを実行することで、datetime型への変換と曜日を取得し、dfに列を追加することができました。
コードの解説
以下に各コードごとの処理について解説していいきます。
datetime.strptimeでdatetimeの取得
datetime.strptime()
とは、datetimeモジュールの1つです。日付や時刻を表す文字列 (str)からdatetimeオブジェクト(time)に変換(parse)することができる。すなわち、str parse time
で.strptime()
と覚えるといいです。これを使用する際には、元の文字列に対応する書式化文字列を指定する必要があります。
書式化文字列
識別子 | 意味 | 例 | |
%d |
0埋めした10進数で表記した月中の日にち。 | 01, 02, …, 31 | |
%m |
0埋めした10進数で表記した月。 | 01, 02, …, 12 | |
%Y |
西暦 (4桁) の 10 進表記を表します。 | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | |
%H |
0埋めした10進数で表記した時 (24時間表記)。 | 00, 01, …, 23 | |
%I |
0埋めした10進数で表記した時 (12時間表記)。 | 01, 02, …, 12 | |
%M |
0埋めした10進数で表記した分。 | 00, 01, …, 59 | |
%S |
0埋めした10進数で表記した秒。 | 00, 01, …, 59 |
in_df1
は「西暦4桁/月/日にち」の形で示されているため識別子は「’%Y/%m/%d’」を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# in_df1の場合 from datetime import datetime # 空リスト作成 date_list=[] week_name_list=[] for i in in_df1['date']: # datetimeオブジェクトの作成 date = datetime.strptime(i, '%Y/%m/%d') date_list.append(date) date_list |
出力結果
1 2 3 4 5 |
[datetime.datetime(2021, 11, 22, 0, 0), datetime.datetime(2021, 11, 23, 0, 0), datetime.datetime(2021, 11, 24, 0, 0), datetime.datetime(2021, 11, 25, 0, 0), datetime.datetime(2021, 11, 26, 0, 0)] |
datetimeに年情報を追加する
それでは、in_df2
はどのように示されるでしょうか?
in_df2
は「月/日にち 時間:分」の形で示されているため識別子は「’%m/%d %H:%M’」を使用でしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# in_df2の場合 from datetime import datetime # 空リスト作成 date_list=[] week_name_list=[] for i in in_df2['date']: # datetimeオブジェクトの作成 date = datetime.strptime(i, '%m/%d %H:%M') date_list.append(date) date_list |
出力結果
1 2 3 4 5 |
[datetime.datetime(1900, 11, 22, 15, 30), datetime.datetime(1900, 11, 23, 16, 0), datetime.datetime(1900, 11, 24, 9, 0), datetime.datetime(1900, 11, 25, 10, 0), datetime.datetime(1900, 11, 26, 12, 30)] |
出力結果を見ると年に全て「1900」と出力されてしまい、これはデフォルトの仕様のようです。そのため、「2021年」と表示されるように、11行目に「’2021/’」と手動で追加し以下のように改訂します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# in_df2の場合, Yearを追加 from datetime import datetime # 空リスト作成 date_list=[] week_name_list=[] for i in in_df2['date']: # datetimeオブジェクトの作成 date = datetime.strptime('2021/'+i, '%Y/%m/%d %H:%M') date_list.append(date) date_list |
出力結果
1 2 3 4 5 |
[datetime.datetime(2021, 11, 22, 15, 30), datetime.datetime(2021, 11, 23, 16, 0), datetime.datetime(2021, 11, 24, 9, 0), datetime.datetime(2021, 11, 25, 10, 0), datetime.datetime(2021, 11, 26, 12, 30)] |
これで、datetime.strptime()
を用いて文字列からdatetimeへの変換が行えました。
datetime.strftimeでdatetimeからstr変換
datetime.strftime()
とは、上で紹介したstrptime()
と同様にdatetimeモジュールの1つです。違いは日付や時刻を表す文字列 (str)をdatetimeオブジェクト(time)から(from)変換することができる。すなわち、str from time
で.strftime()
と覚えるといいです。これを使用する際にも先ほどと同じく、元の文字列に対応する書式化文字列を指定する必要があります。
書式化文字列
識別子 | 意味 | 例 |
%A |
省略しない記載での曜日 | Monday, Tuesday, …, Sunday |
%a |
省略記載での曜日 | Mon, Tue, …, Sun |
ここでは省略形式でない曜日を示したいので'%A'
で記載します。
1 2 3 4 5 6 7 8 9 10 11 12 |
import datetime # 曜日の作成 # 1. datetime.strptime(): strからdatetimeへ変換 someday = datetime.datetime.strptime("2021/11/22", "%Y/%m/%d") print(someday) #-> 2021-11-22 00:00:00 # 2. strftime(): datetimeからstrへ変換 someday.strftime('%A') #-> Monday |
上記を実行することでコード中に書かれている出力結果が出たら成功です。
おまけ:calendarモジュールで曜日を表示
上記ではdatetimeモジュールを使用しましたが、「calenderモジュール」を使用しても同様の作業を行うことができます。
calendar
とは、Pythonの標準ライブラリcalendarモジュールを指し、カレンダーをプレーンテキストやHTML、数値のリストとして生成し取得・出力できます。
今回はその中でweekday()
とday_name[]
オブジェクトを使用し、datetime型から曜日情報を取り出したいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Reference: https://itips.krsw.biz/python-get-week-number/ import datetime import calendar # 曜日の作成 # 1. datetime.strptime(): strからdatetimeへ変換 someday = datetime.datetime.strptime("2021/11/22", "%Y/%m/%d") print(someday) #-> 2021-11-22 00:00:00 # 2. weekday(): datetimeから曜日番号へ変換 week_num_someday = someday.weekday() print(week_num_someday) #-> 0 # 3. calendar.day_name[]: 曜日番号から曜日へ変換 week_name_someday = calendar.day_name[week_num_someday] print(week_name_someday) #-> Monday |
上記を実行することでコード中に書かれている出力結果が出たら成功です。
最後に
「Pythonチートシート」で毎回よく使う作業のPythonコードをまとめ、今回は「pandas DataFrameで日時をdatetime型に変換して曜日を追加する」コードを紹介しました。
他にもいろいろなチートシートを用意しておりますので以下から確認してみてください。
コメント
[…] pandas DataFrameで日時をdatetime型に変換して曜日を追加する […]