Python には、すぐに使える様々な便利なオブジェクトが付属しています。日付オブジェクトはそのようなオブジェクトの例です。日付型は日付と時刻が複雑なため、ゼロから操作するのは困難です。しかし、Pythonの日付オブジェクトを使えば、日付を望ましい文字列形式に変換することが非常に簡単になります。
日付の書式設定は、プログラマとして直面する最も重要な作業の1つです。世界中のさまざまな地域で、日付や時刻を表現する方法が異なるため、プログラマとしての目標は、ユーザーが読みやすい方法で日付の値を表示することです。
例えば、「02-23-2018」のように日付の値を数値で表現する必要がある場合があります。逆に、同じ日付の値を「2018年2月23日」のような長いテキスト形式で書く必要があるかもしれません。また、別のシナリオでは、数値形式の日付値から文字列形式で月を抽出したい場合があります。
この記事では、さまざまな種類の日付オブジェクトを、その機能とともに勉強していきます。
datetimeモジュール
Pythonの datetime
モジュールは、おそらく推測できるように、日付と時刻の値を扱うためのメソッドを含んでいます。このモジュールを使うには、まず、以下のように import
ステートメントでインポートします。
import datetime
時刻の値を表すには、 time
クラスを使用します。time` クラスの属性には、時、分、秒、マイクロ秒が含まれます。
time` クラスの引数は省略可能である。引数を指定しない場合は 0 の時刻が返されますが、ほとんどの場合、このような時刻は必要ないと思われます。
例えば、1時間10分20秒13マイクロ秒の値を持つtimeオブジェクトを初期化するには、次のコマンドを実行します。
t = datetime.time(1, 10, 20, 13)
時刻を見るには、print
関数を使用してみましょう。
print(t)
出力してみましょう。
01:10:20.000013
時、分、秒、マイクロ秒のいずれかを表示する必要がある場合は、以下のようにします。
print('hour:', t.hour)
出力
hour: 1
上記の時刻の分、秒、マイクロ秒は、以下のように取得できます。
print('Minutes:', t.minute)
print('Seconds:', t.second)
print('Microsecond:', t.microsecond)
出力
Minutes: 10
Seconds: 20
Microseconds: 13
カレンダーの日付の値は date
クラスで表現することができる。インスタンスは年、月、日の属性を持つ。
今日の日付を見るために today
メソッドを呼び出してみましょう。
import datetime
today = datetime.date.today()
print(today)
出力する。
2018-09-15
このコードは今日の日付を返すので、表示される出力は上のスクリプトを実行した日に依存します。
では、ctime
メソッドを呼び出して、別のフォーマットで日付を表示してみましょう。
print('ctime:', today.ctime())
出力します。
ctime: Sat Sep 15 00:00:00 2018
ctime` メソッドは、前に見た例よりも長い日付-時刻のフォーマットを使用します。このメソッドは主に、Unix-time (1970年1月1日からの秒数) を文字列形式に変換するために使用されます。
そして、 date
クラスを使用して、年、月、日を表示する方法を紹介します。
print('Year:', today.year)
print('Month:', today.month)
print('Day :', today.day)
出力
Year: 2018
Month: 9
Day : 15
strftimeによる日付の文字列への変換
さて、DateとTimeオブジェクトの作り方がわかったところで、それらをより読みやすい文字列にフォーマットする方法を学びましょう。
これを実現するために、strftime
メソッドを使用します。このメソッドは、日付オブジェクトを読みやすい文字列に変換する手助けをしてくれます。次のシンタックスに示すように、2つのパラメータを受け取ります。
time.strftime(format, t)
最初のパラメータはフォーマット文字列で、2番目のパラメータはフォーマットされる時間で、これは省略可能です。
このメソッドは、次の例に示すように datetime
オブジェクトに対して直接使用することもできます。
import datetime
x = datetime.datetime(2018, 9, 15)
print(x.strftime("%b %d %Y %H:%M:%S"))
出力
Sep 15 2018 00:00:00
ここでは、以下の文字列を使用して日付をフォーマットしています。
%b
: 月名の最初の3文字を返します。この例では、”Sep “を返しています。%d
: 1から31までの、その月の日数を返します。この例では、”15 “が返されます。%Y
: 年を4桁の数字で返します。この例では、”2018 “が返されます。%H
: 時間を返します。この例では、”00 “を返します。%M
: 分(00から59まで)を返します。この例では、”00 “が返されます。%S
: 秒を 00 から 59 までで返します。この例では、”00 “が返されます。
時刻を指定していないので、時刻の値はすべて “00 “です。次の例は、時刻をどのように書式化できるかを示しています。
import datetime
x = datetime.datetime(2018, 9, 15, 12, 45, 35)
print(x.strftime("%b %d %Y %H:%M:%S"))
出力
Sep 15 2018 12:45:35
文字コード一覧
上であげた文字列の他に、 strftime
メソッドは日付の値をフォーマットするためのいくつかのディレクティブを受け取ります。
%a
: 曜日を表す最初の3文字を返す(例: Wed)。%A
: 曜日名のフルネームを返す(例: Wednesday)。%B
: 月の完全な名称を返す(例: September)。%w
: 日曜日を 0 とした、0 から 6 までの数字で曜日を返します。%m
: 月を 01 から 12 までの数字で返します。%p
: 時刻をAM/PMで返す。%y
: 年を2桁の数字で、つまり世紀を除いた数字で返します。例えば、”2018 “の代わりに “18”。%f
: マイクロ秒を 000000 から 999999 までで返します。%Z
: タイムゾーンを返す。%z
: UTCオフセットを返す%j
: 001 から 366 までの、その年における日数を返します。%W
: 00 から 53 までの、その年の週番号を返す。ただし、月曜日を週の初日としてカウントする。%U
: 00 から 53 までのその年の週番号を、日曜日を各週の最初の日として数えたものを返します。%c
: ローカルの日付と時刻のバージョンを返す。%x
: ローカルの日付のバージョンを返す%X
: ローカルの時刻のバージョンを返す。
次のような例を考えてみましょう。
import datetime
x = datetime.datetime(2018, 9, 15)
print(x.strftime('%b/%d/%Y'))
出力
Sep/15/2018
そして、月だけを取得する方法は以下の通りです。
print(x.strftime('%B'))
出力します。
September
年号を表示してみましょう。
print(x.strftime('%Y'))
出力してください。
2018
この例では、フォーマットコードとして %Y
を使っています。Y`は大文字であることに注意してください。では、小文字で書いてみましょう。
print(x.strftime('%y'))
出力してください。
18
今度は、世紀が省略されています。このように、これらの書式コードを使えば、ほぼすべての形式で日付を表現することができるのです。
strptimeで文字列を日付に変換する
strftimeメソッドは日付オブジェクトをより読みやすい文字列に変換するのに役立ちました。strptime
メソッドはその逆、つまり、文字列を受け取って Python が理解できる日付オブジェクトに変換します。
以下はこのメソッドのシンタックスである。
datetime.strptime(string, format)
パラメータ string
は日付フォーマットに変換したい文字列フォーマットの値です。format` パラメータは、変換後の日付の書式を指定するディレクティブです。
例えば、文字列 “9/15/18” を datetime
オブジェクトに変換する必要があるとします。
まず、 datetime
モジュールをインポートしよう。このとき、ドットフォーマットなしで特定のモジュールの関数を参照できるように、 from
キーワードを使用します。
from datetime import datetime
そして、文字列の形で日付を定義します。
str = '9/15/18'
Pythonは上記の文字列を実際の datetime
オブジェクトに変換するまで、datetimeとして理解することができません。これは strptime
メソッドを呼び出すことで行うことができます。
以下のコマンドを実行して、文字列を変換してください。
date_object = datetime.strptime(str, '%m/%d/%y')
次に、 print
関数を呼び出して、文字列を datetime
フォーマットで表示してみましょう。
print(date_object)
出力します。
2018-09-15 00:00:00
見てわかるように、変換は成功しました!
フォワードスラッシュ “/” が文字列の様々な要素を区切るのに使われているのがわかるでしょう。これは strptime
メソッドに日付の形式を伝えるもので、この例では “/” がセパレータとして使われています。
しかし、もし日/月/年が”-“で区切られていたらどうでしょうか?ここでは、それをどのように扱うかを説明します。
from datetime import datetime
str = '9-15-18'
date_object = datetime.strptime(str, '%m-%d-%y')
print(date_object)
出力します。
2018-09-15 00:00:00
繰り返しますが、書式指定子のおかげで strptime
メソッドは日付をパースして日付オブジェクトに変換することができました。
結論
今回は、Pythonで日付をフォーマットする方法について勉強しました。Pythonの datetime
モジュールを使って、日付と時刻の値を操作する方法を見ました。このモジュールには、この目的のために使用できる多くのクラスが含まれています。例えば、 time
クラスは時間の値を表すのに使われ、 date
クラスはカレンダーの日付の値を表すのに使われます。