秒数から時間、分、秒数を綺麗に得る(Python)

2024/10/09に公開

こんにちは、沙代です。
だいぶ秋っぽくなってきましたね。でも、昔ってこれが夏じゃありませんでしたっけ?

tqdmのテストコードを読んでいたら、Pythonicに時間、分、秒数を得る方法があったので、備忘のためメモしておきたいと思います。
(コーダーの方感謝です)

TL;DR

mins, s = divmod(int(seconds), 60)
h, m = divmod(mins, 60)
print(f"{h:d}:{m:02d}:{s:02d}")

今まで

divmodを知らなかったので、毎回%,//を使ってやっていました。

こんな感じ
h = int(seconds) // 3600
m = (int(seconds) % 3600) // 60
s = int(seconds) % 60
print(f"{h}:{m:02}:{s:02}")

コードの発見

tqdm/std.py
    @staticmethod
    def format_interval(t):
        """
        Formats a number of seconds as a clock time, [H:]MM:SS

        Parameters
        ----------
        t  : int
            Number of seconds.

        Returns
        -------
        out  : str
            [H:]MM:SS
        """
        mins, s = divmod(int(t), 60)
        h, m = divmod(mins, 60)
        return f'{h:d}:{m:02d}:{s:02d}' if h else f'{m:02d}:{s:02d}'

美しいですね。

おまけ

一文字変数名は避けるのが望ましくありますが、使用を局所に絞った場合、逆に1文字の方がわかりやすいこともありますね。

JavaScriptやVimScriptにはdivmodに該当する関数がぱっと見なさそうで、少し残念です。(作ればいいんですけどね)

参考にさせていただいたページ

https://github.com/tqdm/tqdm/blob/v4.66.5/tqdm/std.py#L401

Discussion