Я пытаюсь написать код для подсчета разницы входа и выхода, в минутах
Я пытался написать код для подсчета разницы входа и выхода, если рабочие часы с 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