Pythonで12時間形式の時刻に分を追加する方法
ここでは、am または pm の接尾辞が付いた12時間制の時刻を表す文字列と、整数 n が与えられた場合に、その時刻へ n 分を加算し、同じ形式で新しい時刻を返す方法を解説します。
例えば、入力が s = "8:20pm"、n = 150 の場合、出力は 10:50pm になります。
解決の手順
この問題を解くために、以下の手順に従います。
- h, m: 文字列 s から「時」と「分」の部分を取り出します
- h: h を 12 で割った余りに置き換えます(h mod 12)
- 時刻 s が 'pm' の場合は、h に 12 を加算します(24時間表現へ変換)
- t: h × 60 + m + n を計算し、総分数を求めます
- h, m: t ÷ 60 の商を h、余りを m とします(divmodを使用)
- h: h を 24 で割った余りに置き換え、日をまたぐケースに対応します
- suffix: h < 12 なら 'a'(午前)、それ以外なら 'p'(午後)とします
- h: 再び h を 12 で割った余りに置き換えます
- h が 0 の場合は、h を 12 に設定します(12時間制では 0 時は 12 時と表記するため)
- 最後に「時:分+接尾辞」の形式で結果を返します
実装例
理解を深めるために、以下の実装を見てみましょう。
class Solution:
def solve(self, s, n):
h, m = map(int, s[:-2].split(':'))
h %= 12
if s[-2:] == 'pm':
h += 12
t = h * 60 + m + n
h, m = divmod(t, 60)
h %= 24
suffix = 'a' if h < 12 else 'p'
h %= 12
if h == 0:
h = 12
return "{:02d}:{:02d}{}m".format(h, m, suffix)
ob = Solution()
print(ob.solve("8:20pm", 150))
入力
"8:20pm", 150
出力
10:50pm
コードのポイント
s[:-2].split(':')により、「am/pm」を除いた時刻部分を分割して数値化していますdivmod(t, 60)を使うことで、商(時間)と余り(分)を同時に取得でき、コードが簡潔になります"{:02d}:{:02d}{}m".format(...)によって、分や時が一桁でも必ず2桁でゼロ埋めされ、見やすい出力になります
このアルゴリズムを使えば、日をまたいだ時刻の加算にも正しく対応できるため、12時間形式の時刻計算を扱うさまざまな場面で応用できます。
-
Pythonで時系列データをプロットする方法をわかりやすく解説
Pythonのmatplotlibを使えば、時系列データ(日時を軸にしたデータ)を簡単にグラフ化できます。ここでは、datetimeオブジェクトを含むデータを折れ線グラフとして描画する基本的な手順を紹介します。 時系列プロットの基本手順 numpyを使用して、x軸(日時データ)とy軸(数値データ)を作成します。 plot()メソッドを使って、作成したx・yのデータをプロットします。 show()メソッドを実行して、図を画面に表示します。 コード例 以下のサンプルコードでは、2021年1月1日の0時から23時までの24個の日時データを生成し、それに対応するランダムな数値をy軸としてプロットし
-
Pythonでのベクトル化とは?NumPyによる高速な配列演算の基礎を解説
本記事では、Python 3.xにおける「ベクトル化(Vectorization)」の概念と、その実装に用いられるさまざまなテクニックについて解説します。ループ処理を排除した効率的なコードの書き方を、具体例とともに見ていきましょう。 ベクトル化とは何か? ベクトル化とは、ループを使用せずに配列操作を実装するテクニックです。関数を活用することで、コードの実行時間や計算時間を大幅に短縮できます。 ベクトル化では、配列に対して個別に処理を行うのではなく、ベクトル全体に対して一括で演算を実行します。代表的な演算には以下のようなものがあります。 ドット積(内積・スカラー積):2つのベクトルから単一のス