読み込み中...

Pythonにおけるstrftime関数の詳細な使い方まとめ

strftime関数の徹底解説 Python
この記事は約23分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●strftimeとは?

Pythonを始めて、日付や時刻の処理に苦心している方は多いのではないでしょうか。

特に、日付や時刻を特定の形式で表示したい場合、どのように対処すればよいか悩むことがあると思います。

そんな時に役立つのが、Pythonのstrftime関数です。

strftimeは「string format time」の略で、日付や時刻をプログラマーが指定した形式の文字列に変換する関数です。

この関数を使いこなすことで、日付や時刻の表示を自在にコントロールできるようになります。

○strftimeの基本的な使い方

strftimeを使用するには、まずdatetimeモジュールをインポートする必要があります。

datetimeモジュールには、日付や時刻を扱うための様々なクラスや関数が用意されています。

strftimeの基本的な構文は次の通りです。

from datetime import datetime

現在の日時 = datetime.now()
フォーマット済み文字列 = 現在の日時.strftime(フォーマット文字列)

フォーマット文字列には、特殊な書式指定子を使用します。

例えば、”%Y”は4桁の西暦年、”%m”は2桁の月、”%d”は2桁の日を表します。

実際に使用例を見てみましょう。

○サンプルコード1:現在時刻を指定フォーマットで出力

from datetime import datetime

現在の日時 = datetime.now()
フォーマット済み文字列 = 現在の日時.strftime("%Y年%m月%d日 %H時%M分%S秒")
print(フォーマット済み文字列)

実行結果

2024年06月29日 14時30分45秒

このコードでは、現在の日時を年、月、日、時、分、秒の順に日本語表記で出力しています。

%Yは4桁の西暦年、%mは2桁の月、%dは2桁の日、%Hは24時間制の時、%Mは分、%Sは秒を表しています。

strftimeを使うことで、日付や時刻を好みのフォーマットで簡単に表示できることがお分かりいただけたでしょうか。

この機能は、ログファイルの作成やユーザーインターフェースの表示など、様々な場面で活用できます。

承知いたしました。ご指定の内容に基づいて、Pythonのstrftime関数に関する記事を続けて執筆いたします。

●日付と時刻の書式指定

strftime関数を使いこなすには、日付と時刻の書式指定について深く理解する必要があります。

書式指定子を適切に組み合わせることで、様々な形式で日付や時刻を表現できます。

よく使用される書式指定子をいくつか紹介しましょう。

%Y: 4桁の西暦年
%m: 2桁の月(01-12)
%d: 2桁の日(01-31)
%H: 24時間制の時(00-23)
%M: 分(00-59)
%S: 秒(00-59)
%A: 曜日の名称(例:Sunday)
%B: 月の名称(例:January)

実際に、日付だけを出力するサンプルコードを見てみましょう。

○サンプルコード2:日付だけを出力

from datetime import datetime

現在の日時 = datetime.now()
日付のみ = 現在の日時.strftime("%Y年%m月%d日 (%A)")
print(日付のみ)

実行結果

2024年06月29日 (Saturday)

このコードでは、年、月、日に加えて、曜日も英語で表示しています。

%Aを使用することで、曜日を文字列で出力できます。

では、時刻だけを出力するサンプルコードも見てみましょう。

○サンプルコード3:時刻だけを出力

from datetime import datetime

現在の日時 = datetime.now()
時刻のみ = 現在の日時.strftime("%H:%M:%S")
print(時刻のみ)

実行結果

14:30:45

このコードでは、時、分、秒をコロンで区切って表示しています。

24時間制で表示されるため、午後2時30分45秒は14:30:45と表示されます。

さらに詳細な時刻情報が必要な場合もあるでしょう。

ミリ秒まで含めた時刻を出力するサンプルコードを見てみましょう。

○サンプルコード4:ミリ秒も含めた詳細な時刻を出力

from datetime import datetime

現在の日時 = datetime.now()
詳細な時刻 = 現在の日時.strftime("%H:%M:%S.%f")
print(詳細な時刻)

実行結果

14:30:45.123456

このコードでは、%fを使用してミリ秒まで表示しています。

%fは小数点以下6桁(マイクロ秒)まで表示します。

実務では、ミリ秒まで含めた詳細な時刻情報が必要になる場合があります。

例えば、ログファイルの作成やパフォーマンス計測などで活用できます。

承知いたしました。ご指定の内容に基づいて、Pythonのstrftime関数に関する記事を続けて執筆いたします。

●文字列からdatetimeオブジェクトへの変換

日付や時刻を扱う際、文字列形式のデータをPythonのdatetimeオブジェクトに変換する必要が生じることがあります。例えば、ユーザーから入力された日付や、外部システムから受け取ったデータを処理する場合などです。そんな時に役立つのが、strptimeメソッドです。

strptimeは「string parse time」の略で、文字列をdatetimeオブジェクトに変換する機能を提供します。strftimeとは逆の操作を行うと考えると分かりやすいでしょう。

○サンプルコード6:文字列からdatetime変換(strptime)

それでは、具体的なコード例を見てみましょう。

from datetime import datetime

# 文字列形式の日時
日時文字列 = "2024-06-29 14:30:45"

# 文字列をdatetimeオブジェクトに変換
日時オブジェクト = datetime.strptime(日時文字列, "%Y-%m-%d %H:%M:%S")

print(f"変換前の文字列: {日時文字列}")
print(f"変換後のdatetimeオブジェクト: {日時オブジェクト}")
print(f"年: {日時オブジェクト.year}")
print(f"月: {日時オブジェクト.month}")
print(f"日: {日時オブジェクト.day}")
print(f"時: {日時オブジェクト.hour}")
print(f"分: {日時オブジェクト.minute}")
print(f"秒: {日時オブジェクト.second}")

実行結果:

変換前の文字列: 2024-06-29 14:30:45
変換後のdatetimeオブジェクト: 2024-06-29 14:30:45
年: 2024
月: 6
日: 29
時: 14
分: 30
秒: 45

このコードでは、文字列形式の日時データをdatetimeオブジェクトに変換しています。strptimeメソッドを使用する際は、変換したい文字列と、その文字列のフォーマットを指定します。フォーマットの指定方法は、strftimeと同じ書式指定子を使用します。

変換後のdatetimeオブジェクトからは、年、月、日、時、分、秒などの情報を個別に取得できます。経験上、この機能は日付の計算や比較を行う際に非常に便利だと感じます。

例えば、ユーザーから入力された日付が特定の期間内にあるかどうかをチェックしたり、二つの日付の差分を計算したりする場合に活用できます。

●文字列からdatetimeオブジェクトへの変換

文字列形式の日時データを扱う機会は、実務において非常に多いものです。

ユーザーからの入力、外部APIからのレスポンス、データベースからの取得データなど、様々な場面で文字列形式の日時に遭遇します。

Pythonでこのような文字列をdatetimeオブジェクトに変換する方法を理解することは、効率的なプログラミングを行う上で非常に重要です。

○サンプルコード6:文字列からdatetime変換(strptime)

まずは、基本的な文字列からdatetime変換の例を見てみましょう。

from datetime import datetime

# 文字列形式の日時
日時文字列 = "2024年6月29日 14時30分45秒"

# 文字列をdatetimeオブジェクトに変換
日時オブジェクト = datetime.strptime(日時文字列, "%Y年%m月%d日 %H時%M分%S秒")

print(f"変換前の文字列: {日時文字列}")
print(f"変換後のdatetimeオブジェクト: {日時オブジェクト}")
print(f"年: {日時オブジェクト.year}")
print(f"月: {日時オブジェクト.month}")
print(f"日: {日時オブジェクト.day}")
print(f"時: {日時オブジェクト.hour}")
print(f"分: {日時オブジェクト.minute}")
print(f"秒: {日時オブジェクト.second}")

実行結果

変換前の文字列: 2024年6月29日 14時30分45秒
変換後のdatetimeオブジェクト: 2024-06-29 14:30:45
年: 2024
月: 6
日: 29
時: 14
分: 30
秒: 45

このコードでは、日本語の年月日時分秒形式の文字列をdatetimeオブジェクトに変換しています。

strptimeメソッドの第一引数に変換したい文字列を、第二引数にその文字列のフォーマットを指定します。

フォーマットの指定には、先ほど学んだstrftimeと同じ書式指定子を使用します。

変換後のdatetimeオブジェクトからは、year、month、day、hour、minute、second属性を使って個別の値を取得できます。

この機能は、日付の計算や比較を行う際に非常に便利です。

○サンプルコード7:タイムゾーン付き文字列からdatetime変換

次に、タイムゾーン情報を含む文字列からdatetime変換を行う例を見てみましょう。

from datetime import datetime
from zoneinfo import ZoneInfo

# タイムゾーン付きの文字列形式の日時
タイムゾーン付き日時文字列 = "2024-06-29 14:30:45+09:00"

# タイムゾーン付き文字列をdatetimeオブジェクトに変換
タイムゾーン付き日時オブジェクト = datetime.strptime(タイムゾーン付き日時文字列, "%Y-%m-%d %H:%M:%S%z")

print(f"変換前の文字列: {タイムゾーン付き日時文字列}")
print(f"変換後のdatetimeオブジェクト: {タイムゾーン付き日時オブジェクト}")
print(f"タイムゾーン: {タイムゾーン付き日時オブジェクト.tzinfo}")

# UTCに変換
utc日時 = タイムゾーン付き日時オブジェクト.astimezone(ZoneInfo("UTC"))
print(f"UTC時間: {utc日時}")

# 別のタイムゾーンに変換(例:ニューヨーク)
ny日時 = タイムゾーン付き日時オブジェクト.astimezone(ZoneInfo("America/New_York"))
print(f"ニューヨーク時間: {ny日時}")

実行結果

変換前の文字列: 2024-06-29 14:30:45+09:00
変換後のdatetimeオブジェクト: 2024-06-29 14:30:45+09:00
タイムゾーン: UTC+09:00
UTC時間: 2024-06-29 05:30:45+00:00
ニューヨーク時間: 2024-06-29 01:30:45-04:00

このコードでは、タイムゾーン情報(+09:00)を含む文字列をdatetimeオブジェクトに変換しています。

タイムゾーン情報を含む場合、フォーマット指定子に”%z”を使用します。

変換後のdatetimeオブジェクトは、tzinfo属性にタイムゾーン情報を保持しています。

astimezoneメソッドを使用すると、異なるタイムゾーンに変換することができます。

実務では、異なるタイムゾーンのユーザーやシステムとデータをやり取りする機会が多くあります。

タイムゾーンを考慮した日時処理は、グローバルなアプリケーション開発において非常に重要です。

●よくあるエラーと対処法

Pythonでstrftime関数を使用する際、初心者の方々がよく遭遇するエラーがいくつかあります。

経験豊富なエンジニアの方でさえ、時折これらのエラーに悩まされることがあります。

ここでは、よく発生するエラーとその対処法について詳しく解説していきます。

○ValueErrorが発生する場合

ValueErrorは、strftimeやstrptimeを使用する際によく遭遇するエラーの一つです。

このエラーは主に、指定したフォーマットと実際の日時文字列が一致しない場合に発生します。

例えば、次のようなコードを見てみましょう。

from datetime import datetime

日時文字列 = "2024-06-29"
try:
    日時オブジェクト = datetime.strptime(日時文字列, "%Y-%m-%d %H:%M:%S")
    print(日時オブジェクト)
except ValueError as e:
    print(f"エラーが発生しました: {e}")

実行結果

エラーが発生しました: time data '2024-06-29' does not match format '%Y-%m-%d %H:%M:%S'

このコードでは、日付のみを含む文字列に対して、時刻も含むフォーマットを指定しているため、ValueErrorが発生します。

対処法としては、文字列のフォーマットと指定するフォーマットを一致させることが重要です。

上記の例であれば、フォーマットを”%Y-%m-%d”に変更することでエラーを解消できます。

また、ユーザー入力や外部データを扱う場合は、try-except文を使用してエラーをキャッチし、適切なエラーメッセージを表示することをお勧めします。

○書式指定子の間違い

書式指定子の間違いも、初心者がよく遭遇するエラーの一つです。

例えば、月を表す”%m”と分を表す”%M”を間違えてしまうケースがあります。

from datetime import datetime

現在時刻 = datetime.now()
try:
    フォーマット済み文字列 = 現在時刻.strftime("%Y-%M-%d %H:%m:%S")
    print(フォーマット済み文字列)
except ValueError as e:
    print(f"エラーが発生しました: {e}")

このコードでは、月と分の指定子が逆になっています。

しかし、strftimeはValueErrorを発生させずに、意図しない結果を出力します。

実行結果

2024-30-29 14:06:45

対処法としては、strftimeの書式指定子を十分に理解し、適切に使用することが重要です。

また、出力結果を常に確認し、意図した通りのフォーマットになっているか注意深く検証することをお勧めします。

書式指定子を間違えやすい場合は、コメントを使って各指定子の意味を明記することも有効な方法です。

例えば、次のようにコードを書くことができます。

from datetime import datetime

現在時刻 = datetime.now()
フォーマット済み文字列 = 現在時刻.strftime(
    "%Y-%m-%d %H:%M:%S"  # 年-月-日 時:分:秒
)
print(フォーマット済み文字列)

このように、コメントを付けることで、他の開発者(そして将来の自分自身)が理解しやすくなり、ミスを防ぐことができます。

●よくあるエラーと対処法

Pythonでstrftime関数を使用する際、初心者の方々がよく遭遇するエラーがいくつかあります。

経験豊富なエンジニアの方でさえ、時折これらのエラーに悩まされることがあります。

ここでは、よく発生するエラーとその対処法について詳しく解説していきます。

○ValueErrorが発生する場合

ValueErrorは、strftimeやstrptimeを使用する際によく遭遇するエラーの一つです。

このエラーは主に、指定したフォーマットと実際の日時文字列が一致しない場合に発生します。

例えば、次のようなコードを見てみましょう。

from datetime import datetime

日時文字列 = "2024-06-29"
try:
    日時オブジェクト = datetime.strptime(日時文字列, "%Y-%m-%d %H:%M:%S")
    print(日時オブジェクト)
except ValueError as e:
    print(f"エラーが発生しました: {e}")

実行結果

エラーが発生しました: time data '2024-06-29' does not match format '%Y-%m-%d %H:%M:%S'

このコードでは、日付のみを含む文字列に対して、時刻も含むフォーマットを指定しているため、ValueErrorが発生します。

対処法としては、文字列のフォーマットと指定するフォーマットを一致させることが重要です。

上記の例であれば、フォーマットを”%Y-%m-%d”に変更することでエラーを解消できます。

また、ユーザー入力や外部データを扱う場合は、try-except文を使用してエラーをキャッチし、適切なエラーメッセージを表示することをお勧めします。

○書式指定子の間違い

書式指定子の間違いも、初心者がよく遭遇するエラーの一つです。

例えば、月を表す”%m”と分を表す”%M”を間違えてしまうケースがあります。

from datetime import datetime

現在時刻 = datetime.now()
try:
    フォーマット済み文字列 = 現在時刻.strftime("%Y-%M-%d %H:%m:%S")
    print(フォーマット済み文字列)
except ValueError as e:
    print(f"エラーが発生しました: {e}")

このコードでは、月と分の指定子が逆になっています。

しかし、strftimeはValueErrorを発生させずに、意図しない結果を出力します。

実行結果

2024-30-29 14:06:45

対処法としては、strftimeの書式指定子を十分に理解し、適切に使用することが重要です。

また、出力結果を常に確認し、意図した通りのフォーマットになっているか注意深く検証することをお勧めします。

書式指定子を間違えやすい場合は、コメントを使って各指定子の意味を明記することも有効な方法です。

例えば、次のようにコードを書くことができます。

from datetime import datetime

現在時刻 = datetime.now()
フォーマット済み文字列 = 現在時刻.strftime(
    "%Y-%m-%d %H:%M:%S"  # 年-月-日 時:分:秒
)
print(フォーマット済み文字列)

このように、コメントを付けることで、他の開発者(そして将来の自分自身)が理解しやすくなり、ミスを防ぐことができます。

○タイムゾーンの指定ミス

タイムゾーンの指定ミスは、グローバルなアプリケーション開発において特に注意が必要なエラーです。

異なるタイムゾーンのユーザーやシステムとデータをやり取りする際に発生しやすい問題です。

例えば、次のようなコードを見てみましょう。

from datetime import datetime
from zoneinfo import ZoneInfo

東京時間 = datetime.now(ZoneInfo("Asia/Tokyo"))
ニューヨーク時間文字列 = 東京時間.strftime("%Y-%m-%d %H:%M:%S %Z")
print(f"ニューヨーク時間: {ニューヨーク時間文字列}")

実行結果

ニューヨーク時間: 2024-06-29 14:30:45 JST

このコードでは、東京時間を取得していますが、出力時にタイムゾーンの変換を行わずにそのまま出力しています。

結果として、ニューヨーク時間として表示されるべき時刻が、実際には日本時間のままになっています。

対処法としては、適切にタイムゾーンを変換してから出力することが重要です。

正しいコードは次のようになります。

from datetime import datetime
from zoneinfo import ZoneInfo

東京時間 = datetime.now(ZoneInfo("Asia/Tokyo"))
ニューヨーク時間 = 東京時間.astimezone(ZoneInfo("America/New_York"))
ニューヨーク時間文字列 = ニューヨーク時間.strftime("%Y-%m-%d %H:%M:%S %Z")
print(f"ニューヨーク時間: {ニューヨーク時間文字列}")

実行結果

ニューヨーク時間: 2024-06-29 01:30:45 EDT

このように、astimezoneメソッドを使用して適切にタイムゾーンを変換することで、正確なニューヨーク時間を表示することができます。

●strftimeの応用例

strftime関数の基本的な使い方を理解したところで、実務でよく遭遇する具体的な応用例を見ていきましょう。

日付と時刻の処理は、ログファイルの作成、日付計算、他言語との連携など、様々な場面で活用されます。

ここでは、3つのサンプルコードを通じて、strftimeの実践的な使用方法を学んでいきます。

○サンプルコード8:ログファイルに日時を付与

ログファイルの作成は、多くのプログラムで必要とされる機能です。

特に、いつ何が起こったかを正確に記録するために、日時の付与は欠かせません。

strftimeを使用することで、簡単にカスタマイズされた日時フォーマットをログに追加できます。

import logging
from datetime import datetime

# ロガーの設定
logging.basicConfig(filename='app.log', level=logging.INFO,
                    format='%(asctime)s - %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')

# ログメッセージの記録
logging.info('アプリケーションが起動しました')
logging.warning('警告:メモリ使用量が高くなっています')
logging.error('エラー:データベース接続に失敗しました')

# カスタムフォーマットでログを記録
現在時刻 = datetime.now().strftime('%Y年%m月%d日 %H時%M分%S秒')
with open('custom_log.txt', 'a') as f:
    f.write(f'{現在時刻} - カスタムログメッセージ\n')

print("ログファイルにメッセージを記録しました。")

実行結果

ログファイルにメッセージを記録しました。

このコードでは、Pythonの標準ライブラリであるloggingモジュールを使用しています。

loggingモジュールの設定で、strftimeと同様のフォーマット指定を使用してログの日時フォーマットをカスタマイズしています。

また、カスタムログファイルへの書き込みでは、strftimeを直接使用して現在時刻をフォーマットしています。

実行後、’app.log’ファイルには次のような内容が記録されます。

2024-06-29 15:30:45 - アプリケーションが起動しました
2024-06-29 15:30:45 - 警告:メモリ使用量が高くなっています
2024-06-29 15:30:45 - エラー:データベース接続に失敗しました

また、’custom_log.txt’ファイルには次のような内容が記録されます。

2024年06月29日 15時30分45秒 - カスタムログメッセージ

○サンプルコード9:日付計算と書式設定

プロジェクト管理や予定管理などでは、特定の日付から一定期間後の日付を計算し、適切なフォーマットで表示する必要がある場合があります。

strftimeと組み合わせることで、この処理を簡単に行うことができます。

from datetime import datetime, timedelta

# プロジェクト開始日
開始日 = datetime(2024, 6, 29)

# 30日後、60日後、90日後の日付を計算
日付リスト = [開始日 + timedelta(days=days) for days in [30, 60, 90]]

# 日付をフォーマットして表示
for index, 日付 in enumerate(日付リスト, 1):
    フォーマット済み日付 = 日付.strftime('%Y年%m月%d日')
    print(f"マイルストーン{index}: {フォーマット済み日付}")

# 週末(土曜日)のみをリストアップ
週末リスト = []
現在日 = 開始日
終了日 = 開始日 + timedelta(days=180)

while 現在日 <= 終了日:
    if 現在日.weekday() == 5:  # 5は土曜日を表す
        週末リスト.append(現在日)
    現在日 += timedelta(days=1)

print("\n今後6ヶ月間の土曜日:")
for 週末 in 週末リスト:
    print(週末.strftime('%Y年%m月%d日'))

実行結果

マイルストーン1: 2024年07月29日
マイルストーン2: 2024年08月28日
マイルストーン3: 2024年09月27日

今後6ヶ月間の土曜日:
2024年06月29日
2024年07月06日
2024年07月13日
...(中略)...
2024年12月21日
2024年12月28日

このコードでは、まずプロジェクトの開始日から30日後、60日後、90日後のマイルストーン日を計算し、strftimeを使用して日本語形式でフォーマットしています。

次に、開始日から6ヶ月間の全ての土曜日をリストアップし、同様にフォーマットして表示しています。

timedelta関数を使用することで、日付の加算や減算を簡単に行うことができます。

そして、strftimeを使用することで、計算結果を読みやすい形式で表示することができます。

○サンプルコード10:他言語との連携

グローバルなプロジェクトでは、異なる言語や文化圏のユーザーに対応する必要があります。

strftimeを使用することで、言語や地域に応じた日付表示を簡単に実現できます。

import locale
from datetime import datetime

現在時刻 = datetime.now()

# 日本語での日付表示
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
日本語日付 = 現在時刻.strftime('%Y年%m月%d日 (%A)')
print(f"日本語: {日本語日付}")

# 英語(アメリカ)での日付表示
locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
英語日付 = 現在時刻.strftime('%B %d, %Y (%A)')
print(f"English: {英語日付}")

# フランス語での日付表示
locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')
フランス語日付 = 現在時刻.strftime('%d %B %Y (%A)')
print(f"Français: {フランス語日付}")

# ドイツ語での日付表示
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
ドイツ語日付 = 現在時刻.strftime('%A, %d. %B %Y')
print(f"Deutsch: {ドイツ語日付}")

# ロケールをリセット
locale.setlocale(locale.LC_TIME, '')

実行結果

日本語: 2024年06月29日 (土曜日)
English: June 29, 2024 (Saturday)
Français: 29 juin 2024 (Samedi)
Deutsch: Samstag, 29. Juni 2024

このコードでは、localeモジュールを使用して、システムのロケール設定を変更しています。

ロケールを変更することで、strftimeが出力する月名や曜日名が指定した言語で表示されます。

まとめ

Pythonのstrftime関数について、基本的な使い方から応用例まで幅広く解説してきました。

日付と時刻の処理は、一見単純そうに見えて意外と複雑です。

しかし、strftimeをしっかりと理解し、適切に使用することで、多くの課題を簡単に解決できます。

今回学んだ知識を活かし、自信を持ってPythonでの日付・時刻処理に取り組んでいってください。