【Python】文字列(str)データを日付に変更する方法|datetimeのstrptimeメソッドの使い方

python-strptime-in-datetime-module Python
記事内に広告が含まれていることがあります。
[PR]

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)

※変数にはクオテーションは不要です。

変数にクオテーションをつけると以下のようなエラーになります。

エラー例

変数にクオテーションをつけるとエラー
ValueError: time data ‘past’ does not match format ‘%Y/%m/%d’

例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()

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