Я пытаюсь написать код для подсчета разницы входа и выхода, в минутах

Я пытался написать код для подсчета разницы входа и выхода, если рабочие часы с 9:00 по 18:00 и не забывая, что сб-вс выходные дни. У меня подсчитывается все время, а должно так "вход: 16-05-2022 12:00:00 и выход: 17-05-2022 11:23:00" Помогите пожалуйста как это можно реализовать?

Мой код:

def find_minutes(start, end):
    temp = end - start
    days = temp.days
    for i in range(1 ,days+1):     
        now = start + datetime.timedelta(i)
        if now.strftime("%A") in ["Saturday", 'Sunday']:
            temp -= datetime.timedelta(1)
    return temp        

start = datetime.datetime.strptime(input(), "%m-%d-%Y %H:%M:%S")
end = datetime.datetime.strptime(input(), "%m-%d-%Y %H:%M:%S")

print(F"{int(find_minutes(start, end).total_seconds()//60)} minutes")

Ответы (2 шт):

Автор решения: SergFSM

вы проверяете день недели, но не проверяете время. Добавьте в цикл проверку времени, например как-то так:

from datetime import datetime as dt, timedelta as td, time

start = dt.fromisoformat('2022-05-17 17:55:00')
end = dt.fromisoformat('2022-05-17 20:00:00')
time_start = time.fromisoformat('09:00')
time_end = time.fromisoformat('18:00')

res = 0
t = start
while (t:=t+td(minutes=1))<=end:
    if t.weekday()<5 and time_start<=t.time()<=time_end:
        res+=1 
print(res)  # 5

или с помощью pandas примерно так:

import pandas as pd

dates = pd.date_range('2022-05-17 17:55:00', '2022-05-17 20:00:00', freq='T')
res = len(dates[(dates.time>=time_start)&(dates.time<time_end)&(dates.weekday<5)])

print(res)  # 5
→ Ссылка
Автор решения: Namerek

pip install python-dateutil

from datetime import datetime
from dateutil.rrule import *
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta

def worktime_count(start: datetime, end: datetime, unit=MINUTELY):
    return len(
        [
            *rrule(
                unit,
                start,
                until=end - relativedelta(minutes=1),
                byweekday=range(0, 5),
                byhour=range(9, 18),
                wkst=MO
            )
        ]
    )
print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-16 09:10:00')
    )
)
# 20
print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-13 18:00:00')
    )
)
# 10

Ссылка на доку

→ Ссылка