実務に生かすPythonサンプル

【保存版】Pythonのdatetimeで日付/時間を操作【実務での使用例とハマりどころも解説】

こんにちは。投資エンジニアの三年坊主(@SannenBouzu)です。

今回は、Pythonのdatetimeライブラリで日付や時間を操作したい人の疑問に答えます。

Pythonのdatetimeで日付や時間を操作したい。

文字列と相互に変換したり、日付や時間の差を計算するにはどうするんだろう。実務での使用例やハマりどころについても知りたい。

この記事では、エンジニアの実務・大学の研究・趣味で、合わせて5年以上Pythonを使ってきた経験を生かして、Pythonのdatetimeで日付や時間を操作する方法を紹介します。

この記事はこんな方におすすめ!

  • Pythonのdatetimeを使って日付や時間の操作をしたい方
  • 実務での使用例やハマりどころを知りたい方

 

日付/時間を扱うPython標準ライブラリdatetimeで使う主なデータ型まとめ

参考:8.1. datetime — 基本的な日付型および時間型 — Python 3.6.5 ドキュメント

 

datetimeで使う主なデータ型を、実際の使用例とあわせて紹介します。

datetimeをインポートした前提で読み進めてください。Google Colaboratory上で実行して確認しています。

 

datetime.date:日付

dateオブジェクトは日付(年・月・日)を表します。属性として year, month, dateを持ちます。

 

today()を使って、実行日当日のdateオブジェクトを生成できます。

 

datetime.time:時間

timeオブジェクトは時刻(時・分・秒・マイクロ秒)を表します。属性として hour, minute, second, microsecond を持ちます。

 

引数は省略するとゼロになります。

 

timeオブジェクトでは、now()のようなメソッドを使って現在時刻を取得することはできません。

 

datetime.datetime:日付と時間

datetimeオブジェクトは、dateオブジェクト(年・月・日)とtimeオブジェクト(時・分・秒・マイクロ秒)の情報が入っているオブジェクトです

属性として year, month, day, hour, minute, second, microsecond を持ちます。

年・月・日の引数は必須で、その他の引数は任意です。

 

「マイクロ秒」は1,000,000分の1秒です。「ミリ秒」を飛ばして「マイクロ秒」を使うのは少し不思議な感じがしますが。

  • 1秒=1,000ミリ秒
  • 1ミリ秒=1,000マイクロ秒

 

now()やtoday()を使って、実行日当日の日付と時刻をdatetimeオブジェクトとして取得できます

 

datetime.timedelta:date, datetimeの比較・引き算で得られる時間差

timedeltaオブジェクトは、2つの日付や時刻の時間差・経過時間を表すオブジェクトです

属性として days, seconds, microseconds が保持されます。

 

dateやdatetimeオブジェクトに対してtimedeltaオブジェクトの足し算・引き算など四則演算も可能です

 

datetime.tzinfo, datetime.timezone:タイムゾーン

2つ以上のタイムゾーンをまたぐ国や地域で日付や時間の比較をするには、タイムゾーンを意識する必要があります。

timezone クラスは tzinfo のサブクラスで、各インスタンスは UTC からの固定されたオフセットで定義されたタイムゾーンを表しています。

 

datetimeオブジェクトで実行日当日の日付と時刻を取得するnow()の例では、タイムゾーンを指定していなかったので、実行したマシンの時刻(UTCで朝5時台)が返ってきました

下のように日本のタイムゾーンを指定して実行すると、日本のタイムゾーンの情報を含んだdatetimeが返ってきます

 

Pythonのdatetimeライブラリ:実務での使用例・ハマりどころ

①:strftime()とstrptime()が紛らわしい。strftime()は日付→文字列にフォーマット、strptime()は逆

strftime()は日付・時間→文字列に変換、逆にstrptime()は文字列→日付・時間に変換するメソッドです。

fとp、一文字しか違わず紛らわしいですが、覚え方としてはこのように考えるのがおすすめです。

  • fはフォーマットのf。日付・時間を文字列に変換するためのフォーマット(書式)を指定してあげて、時刻を表現する文字列を生成する。
  • pはパースのp。文字列をパースして日付・時間に変換する。

parse, pointerなど諸説あるようですが、実用上はstrftime()をきちんと覚えて、strptime()がその逆と分かれば問題ない場合が多いです。

What does the “p” in strptime stand for?

 

②:strftime()のフォーマットとstr.format()に比べた利点

文字列のstr.format()を使って値を変数を代入していくよりも、strftime()を使った方が効率よく文字列を生成できますし、フォーマットのミスをする可能性も低いです。

私も、strftime()になじみがない頃コードレビューで指摘されて気がつきました。

 

実行速度を簡単に検証してみました。

 

③:ISOフォーマットで出力形式を統一

日付と時刻の表記方法については、ISO 8601という国際規格があり、この国際規格に合わせておくと、APIなどでデータを利用する際もシンプルで分かりやすいのがメリットです。

ISO 8601に準拠した形で時刻を表す文字列を出力してくれるのが、isoformat()というメソッドです

日付と時間を分ける文字(セパレータ)を指定できます(デフォルトは’T’)。

 

業務で「データベースの値を抽出してCSV形式で日次レポートを出力してほしい」と依頼されたことがあったのですが、その際に時刻のフォーマットとしてISOフォーマットが指定されていました。

当時はisoformat()を知らなかったのですが、少し時間を割いて公式ドキュメントを読んでみると、自分のやりたいことを実現してくれる便利な機能がすでに用意されていることもありますね。

 

Pythonのdatetimeで日付と時間を自由自在に操作して、快適なエンジニア生活を送りましょう。

Pythonでcsvファイルの読み込み【csvモジュール】Pythonでcsvファイルを読み込みたいですか?標準のcsvモジュールを使って、Pythonでcsvファイルを読み込む方法を紹介します。ライブラリをインストールせずに気軽に使えるので、記事で詳細を確認して、手元のファイルで試してみてください。...
Python3でMySQL Connectorのインストール・接続方法【快適に使う方法を紹介】Python3でMySQL Connectorをインストールして使うために、基本的な使い方とエラー処理について説明しています。変なエラーになるべく苦しまずに快適に使うための知識を紹介します。Python3でMySQLを操作したい方は是非記事をご覧ください。...
▼経験の棚卸しで納得のキャリアを▼
▼相場に消耗しない資産運用▼
マネースクエア
Pythonチュートリアル

Pythonをインストール、サンプルを通して使い方を学んだら、次は実際に何か作ってみませんか?

手元のパソコンで環境構築不要・Webブラウザだけで、パッと見た人の印象に残るコンテンツを作る手順を一から説明しています。

チュートリアルを見てみる

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください