2023年7月26日水曜日

つまり、一日を [0, 24*60) の区間と捉え、休憩時間や作業時間はその部分集合として扱う。区間=図形=集合にしてしまえば休憩時間の差し引きは単純な集合操作になるので、始業時刻・終業時刻が休憩時間内にあるか否かは考えなくて済む。ルベーグ積分の勉強が初めて役立ったな(ルベーグ積分はまだ理解していない)。

メンバの作業時間を顧客に報告する謎 excel の作成を楽にするために久しぶりに python を書いた。こんな感じの計算をしたい:

  • 12:00-13:00は問答無用で休憩扱い
  • 9:00始業、18:00終業なら稼働時間は8時間
  • 9:00始業、12:30終業なら稼働時間は3時間
  • 13:00始業、21:00終業なら稼働時間は8時間

これまでは見ただけで心が疲れる excel の if を使っていたが、python なら楽に書けた。

import datetime as dt
import sympy as sp

# 休憩時間 12:00-13:00
restTime = sp.Interval(12*60, 13*60)

# 始業から終業までの時間から休憩時間を差し引き
def getWorkTime(totalTime):
    workTime = (totalTime - restTime).measure
    return dt.time(int(workTime/60), int(workTime%60))
    
# 9:00-12:30の場合
start = dt.time(9, 0)
end = dt.time(12, 30)
totalTime = sp.Interval(start.hour * 60 + start.minute, end.hour * 60 + end.minute)
getWorkTime(totalTime)
# datetime.time(3, 0)が返る