1から始めるPythonデータ分析 - やりたいこと逆引きリスト ▶︎▶︎

【Python】日付型データから年・月・日を取り出す方法|datetime

日付型から年月日を取り出す

Pythonの日付型のデータから年・月・日のみを抽出する方法をご紹介します

日付型のデータとは「2020-1-1」のように年月日がひとかたまりになったデータを指します

その日付型のデータから、数値型として「1月」などの「月」部分のみを抽出することで、「年」ごとの違いなどを分析することができます

Pythonの日付型から数値を抽出するイメージ
年月日よりも細かい単位

Pythonの日付型データには日よりも細かい、「時間」「分」「秒」「ミリ秒」まで設定することができ、もちろんそれごとに抽出することができます

どうして年月日のみを取り出すのか?

日付型のデータから年・月・日のみを取り出すことのメリットは、データ分析による比較ができることです

連続した日付のデータでは見えてこない傾向を、細かく区切ることによって明確化します

例えば、東京都の平均気温のデータを「日付型:2020-1-1」と「月:1」にそれぞれ分けてグラフ化してみます

まずは日付型の連続データを可視化していますが、日付の大まかな流れを見るのには最適です

Pythonで可視化した日付の推移のイメージ

続いて「月」に区切って「年」ごとのデータを取り出して加工し、グラフ化します

8月の平均気温が最も高いことが分かります

Pythonで可視化した月ごと平均気温のイメージ

このように日付型のデータを「年月日」ごとに分けることで、より示唆の出やすいデータ加工を実施することができます

事前準備

事前にpandasdatetimeをインポートしておきます

import pandas
import datetime

※サンプルデータ:東京都の気温

気温のイメージ
Pythonで可視化した平均気温

年月日を取り出す方法

Pythonで日付型のデータから年月日を取り出すにはdatetimeをインポートしておき、

yearmonthdayを利用します

① 年を取り出す(year)

df['日付'].dt.year
df['日付'].dt.year

頭にdtを付け、yearを記載すると日付の「年」のみを取り出すことができます

② 月を取り出す(month)

df['日付'].dt.month
df['日付'].dt.month

monthを使うと「月」のみを取り出すことができます

③ 日を取り出す(day)

df['日付'].dt.month
df['日付'].dt.month

dayを使うと「日」のみを取り出すことができます

※DataFrameに格納

df['year'] = df['日付'].dt.year
df['month'] = df['日付'].dt.month
df['day'] = df['日付'].dt.day

それぞれ抽出した「年・月・日」をDataFrameに格納します

df['year'] = df['日付'].dt.year
df['month'] = df['日付'].dt.month
df['day'] = df['日付'].dt.day

④ 時間・分・秒・ミリ秒を取り出す

df['hour'] = df['日付'].dt.hour 
df['minute'] = df['日付'].dt.minute
df['second'] = df['日付'].dt.second
df['microsecond'] = df['日付'].dt.microsecond
df['hour'] = df['日付'].dt.hour 
df['minute'] = df['日付'].dt.minute
df['second'] = df['日付'].dt.second
df['microsecond'] = df['日付'].dt.microsecond

「年月日」より細かい単位を取り出すにはそれぞれhourminutesecondmicrosecondを指定します

※今回は「日」までしかデータが無いため全て「0」となっています

⑤ strftimeを利用して柔軟に抽出する

strftimeを利用して「年月日」を抽出することも可能です

少しクセがありますが「書式」を理解してしまえば、こちらの方が柔軟に日付からデータを取り出すことができます

例えば「年-月」という形式を取得します

df['日付'].dt.strftime('%Y-%m')
df['日付'].dt.strftime('%Y-%m')

4桁の年を表す%Yと2桁の月を表す%mを「-」ハイフンでつないでいます

日付の項目ごとに書式が存在しているため、できれば覚えてみてください

書式 内容
%Y西暦4桁1999, 2000, 2001, 2002 … 2025
%y西暦2桁99, 00, 01, 02 … 25
%m月2桁01, 02, 03, 04, 05 … 12
%b英語の月(省略)Jan, Feb, … Dec
%B英語の月(フル)January, February, … December
%d日2桁01, 02, 03, 04, 05 … 31
%H時 24時間00, 01, 02, 03, 04 … 23
%I時 12時間 00, 01, 02, 03, 04 … 12
%pAM、PMAM, PM , am , pm
%M分2桁00, 01, 02, 03, 04 … 59
%S秒2桁 00, 01, 02, 03, 04 … 59
%A曜日名Sunday, Monday … Saturday
%a曜日名(短縮形)Sun, Mon … Sat

⑥ 曜日を取り出す

曜日を取り出すには少し工夫が必要です

yearのようなオブジェクトとしてweekdayも存在しますが、「月曜日を0」「日曜日を6」として、曜日を整数で取り出されてしまいます

df['日付'].dt.weekday
df['日付'].dt.weekday

これは不便なので⑤で紹介しているstrftime を利用します

書式は%A%aを利用します

df['日付'].dt.strftime('%A')
df['日付'].dt.strftime('%A')

日付を利用してデータ分析をする

応用編として「年月日」を利用してデータ分析をしてみます

売上などを分析する際、日付は非常に有益な情報になります

人の行動は「月」や「曜日」に左右されやすいためです

2018年~2020年までの平均気温で調査してみます

まずは日付をそのままグラフ化

df.pivot_table(index='日付',values='平均気温').plot()
df.pivot_table(index='日付',values='平均気温').plot()

pivot_tableを使って一部データを加工した後で、グラフ化します

【Python】Pythonピボットテーブルを完全攻略|pivot_table

続いて月ごとにグラフ化

df['month'] = df['日付'].dt.month
df.pivot_table(index='month',values='平均気温').plot.bar()
df.pivot_table(index='month',values='平均気温').plot.bar()

monthを日付から取り出して、「月」ごとの平均気温を算出し可視化しています

月ごとに3年を比較する

df['year'] = df['日付'].dt.year
df['month'] = df['日付'].dt.month
df.pivot_table(index='month',columns='year',values='平均気温').plot.bar())
df.pivot_table(index='month',columns='year',values='平均気温').plot.bar())

yearmonthを日付から取り出して、「月」ごとに「年」の平均気温を算出しました

2018年の東京都の気温が例年より高かったのが分かります

またヒートマップを使って可視化もできます


import seaborn as sns
df_year_month = df.pivot_table(index='month',columns='year',values='平均気温')
sns.heatmap(df_year_month,annot=True,cmap='coolwarm')
sns.heatmap(df_year_month,annot=True,cmap='coolwarm')

seabornのライブラリの使い方はこちらから

【Python】seabornで綺麗なグラフ作成を!たった1行で書けます

まとめ

今回は日付型のデータから「年・月・日」の情報を取り出す方法をご紹介してきました

日付だけでは単調な分析で終わってしまうため、「年月日」をそれぞれ取り出して分析してみて下さい

日付型ではないデータを「日付型」にする方法はこちらの記事をご覧ください

【Python】日付型へフォーマット変換する方法|to_datetime
お気に入り登録お願いします

4 COMMENTS

ななし

こんにちは、年ごとに比較する折れ線グラフを作りたくてここにたどり着き「月ごとに3年を比較する」を見て実際に作ることができました!!ありがとうございます!!

しかし調べても調べてもどうしてもできなかったことがあるので質問させてください。

参照するデータは日単位でありながらx軸の目盛は月の始めごとに表示させる折れ線グラフを作りたいのですが設定方法はあるでしょうか。。
現状「4/1 4/26 5/21 6/15….」のように飛び飛びでこれを「4/1 5/1 6/1」というふうに調節したいのですが

ありがとうございます。

返信する
編集長

コメントありがとうございます。お役に立てたようで嬉しいです。

日単位の折れ線グラフでX軸の目盛りを月ごとに可視化したいとのことでしたが、
下記コードでいかがでしょうか?

————————————
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dates

# 本サイトから日付のデータを直接取得する
df = pd.read_html(‘https://smart-hint.com/tokyo-temperature/’)[0]

# 日付を文字列から日付型に変更する
df[‘日付’] = pd.to_datetime(df[‘日付’], format=’%Y/%m/%d’)

# MonthLocatorを利用し月のみX軸に可視化する
ax = plt.subplot()
ax.plot(df[‘日付’], df[‘平均気温’])
ax.xaxis.set_major_locator(dates.MonthLocator([1,2,3,4,5,6,7,8,9,10,11,12]))
ax.xaxis.set_major_formatter(dates.DateFormatter(‘%m’))
plt.show()
————————————

返信する
ななし

お返事ありがとうございます。

私が求めていたのは正にこれです!!

あとはグラフの中のx軸の表示が月だけだったので「%d」を入れるだけで完璧なものになりました!! (一応修正した箇所だけ載せておきます)
ax.xaxis.set_major_formatter(dates.DateFormatter(“%m/%d”))

ありがとうございます!

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です