目次
日付型から年月日を取り出す
Pythonの日付型のデータから年・月・日のみを抽出する方法をご紹介します
日付型のデータとは「2020-1-1」のように年月日がひとかたまりになったデータを指します
その日付型のデータから、数値型として「1月」などの「月」部分のみを抽出することで、「年」ごとの違いなどを分析することができます
Pythonの日付型データには日よりも細かい、「時間」「分」「秒」「ミリ秒」まで設定することができ、もちろんそれごとに抽出することができます
どうして年月日のみを取り出すのか?
日付型のデータから年・月・日のみを取り出すことのメリットは、データ分析による比較ができることです
連続した日付のデータでは見えてこない傾向を、細かく区切ることによって明確化します
例えば、東京都の平均気温のデータを「日付型:2020-1-1」と「月:1」にそれぞれ分けてグラフ化してみます
まずは日付型の連続データを可視化していますが、日付の大まかな流れを見るのには最適です
続いて「月」に区切って「年」ごとのデータを取り出して加工し、グラフ化します
8月の平均気温が最も高いことが分かります
このように日付型のデータを「年月日」ごとに分けることで、より示唆の出やすいデータ加工を実施することができます
事前準備
事前にpandasとdatetimeをインポートしておきます
import pandas
import datetime
※サンプルデータ:東京都の気温
年月日を取り出す方法
Pythonで日付型のデータから年月日を取り出すにはdatetimeをインポートしておき、
year・month・dayを利用します
① 年を取り出す(year)
df['日付'].dt.year
頭にdtを付け、yearを記載すると日付の「年」のみを取り出すことができます
② 月を取り出す(month)
df['日付'].dt.month
monthを使うと「月」のみを取り出すことができます
③ 日を取り出す(day)
df['日付'].dt.month
dayを使うと「日」のみを取り出すことができます
※DataFrameに格納
df['year'] = df['日付'].dt.year
df['month'] = df['日付'].dt.month
df['day'] = df['日付'].dt.day
それぞれ抽出した「年・月・日」をDataFrameに格納します
④ 時間・分・秒・ミリ秒を取り出す
df['hour'] = df['日付'].dt.hour
df['minute'] = df['日付'].dt.minute
df['second'] = df['日付'].dt.second
df['microsecond'] = df['日付'].dt.microsecond
「年月日」より細かい単位を取り出すにはそれぞれhour・minute・second・microsecondを指定します
※今回は「日」までしかデータが無いため全て「0」となっています
⑤ strftimeを利用して柔軟に抽出する
strftimeを利用して「年月日」を抽出することも可能です
少しクセがありますが「書式」を理解してしまえば、こちらの方が柔軟に日付からデータを取り出すことができます
例えば「年-月」という形式を取得します
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 |
%p | AM、PM | AM, 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
これは不便なので⑤で紹介しているstrftime を利用します
書式は%Aか%aを利用します
df['日付'].dt.strftime('%A')
日付を利用してデータ分析をする
応用編として「年月日」を利用してデータ分析をしてみます
売上などを分析する際、日付は非常に有益な情報になります
人の行動は「月」や「曜日」に左右されやすいためです
2018年~2020年までの平均気温で調査してみます
まずは日付をそのままグラフ化
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()
monthを日付から取り出して、「月」ごとの平均気温を算出し可視化しています
月ごとに3年を比較する
df['year'] = df['日付'].dt.year
df['month'] = df['日付'].dt.month
df.pivot_table(index='month',columns='year',values='平均気温').plot.bar())
yearとmonthを日付から取り出して、「月」ごとに「年」の平均気温を算出しました
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')
seabornのライブラリの使い方はこちらから
【Python】seabornで綺麗なグラフ作成を!たった1行で書けますまとめ
今回は日付型のデータから「年・月・日」の情報を取り出す方法をご紹介してきました
日付だけでは単調な分析で終わってしまうため、「年月日」をそれぞれ取り出して分析してみて下さい
日付型ではないデータを「日付型」にする方法はこちらの記事をご覧ください
【Python】日付型へフォーマット変換する方法|to_datetime
こんにちは、年ごとに比較する折れ線グラフを作りたくてここにたどり着き「月ごとに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”))
ありがとうございます!
良かったです。これからもよろしくお願いします!