pandas DataFrameで日時をdatetime型に変換して曜日を追加する 方法 [Pythonチートシート]

Python

Pythonを使っていると複数のコードで共通して使用しているコードがあることに気付きます。その作業を完全に覚えていればいいのですが毎回ウェブで調べてコードを記述して、とすると目的の作業は同じなのにシートごとにコード記述方法が違ってしまい見にくくなってしまいます。
そんなことを解消するのがPythonチートシートです。
今回は「 pandas DataFrameで日時をdatetime型に変換して曜日を追加する 」コードを紹介します。

環境設定
◆ Mac OS
◆ Python 3
◆ JupyterLab

前準備 日付DataFrameの作成

はじめに日付を記載したDataFrameを準備します。以下のコードをコピーして日付表示形式の異なる2つのdfを用意してください。

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

出力結果

# 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モジュール」を使用します。

# 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

出力結果

	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

参照:Python datetimeライブラリ

in_df1「西暦4桁/月/日にち」の形で示されているため識別子は「’%Y/%m/%d’」を使用します。

# 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

出力結果

[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’」を使用でしょうか。

# 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

出力結果

[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/’」と手動で追加し以下のように改訂します。

# 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

出力結果

[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

参照:Python datetimeライブラリ

ここでは省略形式でない曜日を示したいので'%A'で記載します。

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型から曜日情報を取り出したいと思います。

# 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型に変換して曜日を追加する」コードを紹介しました。

他にもいろいろなチートシートを用意しておりますので以下から確認してみてください。

普段よく使う作業の[ Pythonチートシート ]
Pythonを使っていると複数のコードで共通して使用しているコードがあることに気付きます。その作業を完全に覚えていればいいのですが毎回ウェブで調べてコードを記述して、とすると目的の作業は同じなのにシートごとにコード記述方法が違ってしまい見に...

コメント

  1. […] pandas DataFrameで日時をdatetime型に変換して曜日を追加する […]

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