Pythonでは日付データをWEB上でスクレイピングしてくると、文字列(str)として取得されます。こういった文字列のデータを日付データに変更する方法があります。
使うのは、datetimeモジュールのstrptimeメソッドです。
このstrptimeメソッドの使い方を実例を用いて解説しています。
datetimeモジュールのインポート
「import datetime as dt」で省略した表記(エイリアス)を定義して読み込みます。
import datetime as dt
(補足)省略系の定義あり・なしでの使い方の違い
import datetime
datetime.datetime.now()
#冒頭のモジュール名称をフルで記述する必要がある
import datetime
dt.datetime.now()
#冒頭のモジュール名称を省略形で記述できる
文字列の日付をdatetime型の日付に変更する
datetimeモジュールのstrptimeメソッドを使います。
strptimeメソッド
・文字列を日付に変更するメソッド。
datetime.datetime.strptime('A','B')
- datetime.datetime.strptime()はワンセット
- A:文字列(str)
- B:文字列の書式
※変数として渡す場合はクオテーションは不要です。
strptimeメソッドは文字列になっている日付(A)が、どのように記載されているかを第二引数(B)で指定します。
例えば、 strptime(‘2019-1-9′,’%Y-%m-%d’) のように記載します。すると、 西暦4桁が2019、月が1、日付が9と認識し、変換してくれます。
datetimeは時間と分も指定できますが、指定しない場合は0とみなします。
主な指定子
日付けの書式の指定は、定められた指定子を使います。
指定子 | 内容 |
---|---|
%Y | 西暦4桁 |
%y | 西暦下2桁 |
%m | 月(0埋め、0埋めなしどちらも対応) |
%d | 日(0埋め、0埋めなしどちらも対応) |
%H | 時(0埋め、24時間表示) |
%I | 時(0埋め、12時間表示) |
%M | 分(0埋め) |
%S | 秒(0埋め) |
%a | 曜日(曜日を省略) |
%A | 曜日(曜日省略無し) |
(参考)Python公式 datetimeのstrftime() と strptime() の書式コード一覧
strptimeメソッドによる変換処理と出力結果の例
例1 (0埋めなし)
月や日付を0で埋めない(01や02などにしない)場合の例です。
A:「2019-1-9」
B:「%Y-%m-%d」
dt.datetime.strptime('2019-1-9','%Y-%m-%d')
#出力
datetime.datetime(2019, 1, 9, 0, 0)
出力結果の「datatime.datetime」とは、datetimeモジュールのdatetimeメソッドの型という意味です。
日付の型は datetime(年, 月, 日, 時, 分) として記述されます。
例2 (0埋めあり)
月や日付を0で埋める(01や02などにする)場合の例です。
A:「19-05-08」
B:「%y-%m-%d」
dt.datetime.strptime('19-05-08','%y-%m-%d')
#出力
datetime.datetime(2019, 5, 8, 0, 0)
例3 (年月日)
文字列に年月日という日本語が入っている場合です。
A:「2019年05月8日」
B:「%Y年%m月%d日」
dt.datetime.strptime('2019年05月8日','%Y年%m月%d日')
#出力
datetime.datetime(2019, 5, 8, 0, 0)
例4 (文字列と数値の対応)
文字列が文章形式で書かれている場合です。年月日も同不順で並んでいます。
A:「明日の日付は5月8日。年は2019年」
B:「明日の日付は%m月%d日。年は%Y年」
dt.datetime.strptime('明日の日付は5月8日。年は2019年','明日の日付は%m月%d日。年は%Y年')
#出力
datetime.datetime(2019, 5, 8, 0, 0)
例5 (変数)
文字列が変数に格納されている場合です。
A:「past」:'2019/3/23'
B:「%Y/%m/%d」
past= '2019/3/23'
dt.datetime.strptime(past,'%Y/%m/%d')
#出力
datetime.datetime(2019, 3, 23, 0, 0)
※変数にはクオテーションは不要です。
変数にクオテーションをつけると以下のようなエラーになります。
例6 (時,分,秒を含む)
文字列が変数に格納されている場合です。
A:「future」:'2030年3月23日 5時21分42秒 123456マイクロ秒'
B:「%Y年%m月%d日 %H時%M分%S秒 %fマイクロ秒」
past= '2019/3/23'
dt.datetime.strptime(future, '%Y年%m月%d日 %H時%M分%S秒 %fマイクロ秒')
#出力
datetime.datetime(2030, 3, 23, 5, 21, 42, 123456)
%H:時間(24時間表記)
%M:分
%S:秒
%f:マイクロ秒
(補足)datetimeモジュールの使い方の例
現在時刻を求める(nowメソッド)datetime.datetime.now()
コードの意味
①「datetimeモジュール」の②「datetime型(年,月,日,時,分,秒,マイクロ秒)」で「③nowメソッド」により現在時刻を求める。 コード
dt.datetime.now()
#出力
# datetime.datetime(2020, 3, 23, 0, 18, 1, 735003)
[datetime」が2回続くのはなぜ?
はじめてみた時に、「datetime.datetime.now()」のように冒頭にdatetimeが2回も連続で続くのが、くどい、必要なの?という印象だった。
それぞれの意味
そもそも「datetime.datetime.now()」を「①datetime」「②.datetime」「③now()」の3つに区切って考えていたのが間違い。
正しくは「①datetime.datetime」「②now()」の2つの区切りとなる。
オブジェクトとメソッド
メソッドを使う構文はオブジェクト
.メソッド
なので、以下のようになる。
オブジェクト
:①datetime.datetimeメソッド
:②now()
オブジェクト
オブジェクトには実体を入れる。
<実体の例>
・代入された変数(例a = 3)
・インスタンス(クラスを実体化したもの)
→datetime.datetimeはインスタンス
datetimeのインスタンス(クラス)の種類
「datetime.datetime」だけ見てるとわかりにくいが、他にも種類がある。
datetime.date
:日付datetime.time
:時刻datetime.timedelta
:差分datetime.tzinfo
:タイムゾーンの情報
など
実行されていること
▶「datetime.datetime.now()」datetime.datetime
は「日付と時刻」に関する関数をまとめたもの。now()
メソッドで、datetime.datetime
の中で定義されたnow()関数を呼び出している。
▶「datetime.date.now()」
エラーになる。datetime.date
は「時刻」に関する関数をまとめたもの。この中に、now()
という関数は定義されていない。
▶「datetime.time.today()」
これなら使える。datetime.date
のクラスの中に、today()
という関数が定義されている。
まとめ
- datetimeモジュールの中に、複数のクラスが定義してある。
- クラスは扱いたいデータで指定(日付?時刻?両方?など)
- クラス(インスタンス)の指定 :datetime.AAAA
- 各クラスごとに定義されているメソッドが異なる。
- 各クラスに合ったメソッドを使う:datetime.AAAA.BBBB()
datetime.time.today()
datetime.datetime.today()