少なくとも標準的なものではありませんので、自分で作るのが良いと思います。汎用的な方法として
のが良いと思います。私が実装するとしたら、下記のようになるでしょうか。parseという外部パッケージを用いていますがMyTime.parse()を使わないのであれば不要です。
python
1from datetime import datetime, timedelta
2from string import Formatter
3import parse
4
5
6class MyTime:
7 epoch = datetime.strptime("00:00:00", "%H:%M:%S")
8
9 @classmethod
10 def format(cls, time: datetime, format: str, max_unit: str = "D") -> str:
11 dt = time - cls.epoch
12 remainder = dt.total_seconds()
13 units = {"W": 604800, "D": 86400, "H": 3600, "M": 60}
14 process_flag = False
15 values = {}
16 for unit, seconds in units.items():
17 if unit == max_unit:
18 process_flag = True
19 if process_flag:
20 values[unit], remainder = divmod(remainder, seconds)
21 values = {k: int(v) for k, v in values.items()}
22 values["S"] = remainder
23 return Formatter().format(format, **values)
24
25 @classmethod
26 def parse(cls, time_string: str, format: str) -> datetime:
27 units = {"W": 604800, "D": 86400, "H": 3600, "M": 60, "S": 1}
28 parsed = parse.parse(format, time_string)
29 total_seconds = 0.0
30 for unit, seconds in units.items():
31 if unit in parsed:
32 total_seconds += float(parsed[unit]) * seconds
33 return cls.epoch + timedelta(seconds=total_seconds)
使い方は次の通りです。
python
1# datetime型を準備
2# strptimeを使うとマイクロ秒までパース可能だが年月日を省略すると1900-01-01が基準となる
3# 結果: 1900-01-01 02:08:32.000330
4time = "2:08:32.000330"
5t = datetime.strptime(time, "%H:%M:%S.%f")
6print(t)
7
8# シンプルな例
9# 結果: 0 days 2:8:32.00032999999985
10print(MyTime.format(t, "{D} days {H}:{M}:{S}"))
11
12# 時間、分、秒の桁を2桁にし、秒はマイクロ秒まで表示
13# 結果: 0 days 02:08:32.000330
14print(MyTime.format(t, "{D} days {H:02d}:{M:02d}:{S:09.6f}"))
15
16# 時間、分、秒の桁を2桁にし、秒はマイクロ秒まで表示、ただし最大の桁は時間とする
17# 結果: 02:08:32.000330
18print(MyTime.format(t, "{H:02d}:{M:02d}:{S:09.6f}", max_unit="H"))
19
20# 分、秒の桁を2桁にし、秒はマイクロ秒まで表示、ただし最大の桁は分とする
21# 結果: 128:32.000330
22print(MyTime.format(t, "{M:02d}:{S:09.6f}", max_unit="M"))
23
24# 最大の桁を秒とする
25# 結果: 7712.00033
26print(MyTime.format(t, "{S}", max_unit="S"))
27
28# 時間が24時間を超える場合のパース
29# 結果: 1900-01-01 02:08:32.000330
30time = "128:32.000330"
31t = MyTime.parse(time, "{M}:{S}")
32print(t)