目次
日付型にフォーマットの変換
Pythonでは日付のデータ型として「日付型:datetime」があります
「文字列型」や「数値型」とは違い、特殊なデータ型である「日付」を扱うことができます
例えば「12月31日」の次が「12月32日」ではなく「1月1日」になります
今回は文字列や数値型から日付型への変換について方法をご紹介します
文字列/数値型から日付に変換する
データをシステムから取得するとき、最初からデータが日付型であるとは限りません
「2021年5月8日」のように一見、日付型に見えるデータでも裏側では「文字列型」だったりします
また「20210508」のように、8桁の数値で日付型を表現する場合もあります
これらの日付型ではないデータをpandasのto_datetimeで変換することができます
事前準備
事前にpandasをインポートしておきます
import pandas
※サンプルデータ:東京都の気温
※日付は数値型で「yyyymmdd」の8桁になります
文字列/数値型から日付の変換
今回は8桁の数値型で入っている年月日を、日付型に変換します
to_datetimeを利用することで簡単に変換することができます
pd.to_datetime(df['日付'], format='%Y%m%d')
日付書式の指定
formatには変換前のデータがどういう形なのかを指定する必要があります
少し分かりにくいですが、それぞれ書式が存在しています
例えば「4桁の年」を指定するには「%Y」を記載し、「月」は「%m」、「日」は「%d」を続けて書きます
つまり「20210508」は「%Y%m%d」を指定することになります
日付ごとの書式一覧
書式 | 内容 | 例 |
---|---|---|
%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 |
他の文字列が入っている場合
pd.to_datetime('2021年5月8日', format='%Y年%m月%d日')
「2021年5月8日」のように数値以外に違う記号が入っている場合は、「%Y年%m月%d日」のように記載します
pd.to_datetime('2021/5/8', format='%Y/%m/%d')
「/」スラッシュが入っている場合も「%Y/%m/%d」書式の間に「/」を入れましょう
pd.to_datetime('2021 5 8', format='%Y %m %d')
「空白」の場合も「%Y %m %d」書式の間に空白を空けて記述します
pd.to_datetime('2021 may 8', format='%Y %b %d')
英語の月表示(Jan/Feb/Mar)なども「%b」を使えば変換することができます
to_datetimeの書式は分かりにくい部分がありますが、慣れれば簡単に変換することができるようになります
まとめ
今回は to_datetimeを利用して文字列や数値のデータを「日付型」に変換する方法をご紹介してきました
システムによって様々なデータ型で日付は格納されています
書式の設定を一通り覚えて変換を試してみてください
日付データで
198531と19850301を区別して処理できますか?
できない場合は、どの様にすればdatetimeで処理できるようになりますか?
ご質問ありがとうございます。
to_datetimeでformat=’%Y%m%d’と指定すると、どちらも「1985年5月31日」という日付データになるため区別することはできません。
何かの理由で2つの日付パターンを分ける場合は、日付に変更するのではなく桁数を取得した方が良いかもしれません。
len(str(198531))
len(str(19850301))