Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from datetime import datetime, timedelta, date, time
- from scrape import scrape
- import csv
- def time_intersect(start_A, end_A, start_B, end_B):
- """
- accepts 2 timeframe and return the overlap
- :param start_A: datetime
- :param end_A: datetime
- :param start_B: datetime
- :param end_B: datetime
- :return: timedelta
- """
- latest_start = max(start_A, start_B)
- earliest_end = min(end_A, end_B)
- if latest_start <= earliest_end:
- return (earliest_end - latest_start).total_seconds()/3600
- else:
- return 0
- def create_datelist(start_A, end_B, time_start, time_end, sat=False, sun=False):
- """
- takes 2 datetime object iterates to all dates in range of the 2 datetime object
- and combine the time_start and time_end to all dates in range. Returns a list of 2 datetime item list
- :param start_A: datetime
- :param end_B: datetime
- :param time_start: int 0 to 23
- :param time_end: int 0 to 23
- :return: datetime
- """
- if time_start > time_end:
- day_offset = 1
- else:
- day_offset = 0
- counter = 0
- datelist = []
- while True:
- if sat and start_A.weekday() == 5:
- datelist.append([datetime.combine(start_A, time(0)),
- datetime.combine(start_A + timedelta(days=1), time(0))])
- elif sun and start_A.weekday() == 6:
- datelist.append([datetime.combine(start_A, time(0)),
- datetime.combine(start_A + timedelta(days=1), time(0))])
- elif not sat and not sun:
- datelist.append([datetime.combine(start_A, time(time_start)),
- datetime.combine(start_A + timedelta(days=day_offset), time(time_end))])
- counter += 1
- start_A += timedelta(days=counter)
- if start_A.date() > end_B.date():
- break
- return datelist
- #Sample data from scrape() [[2019-03-19 00:00:00,2019-03-19 06:00:00,Staff name,Client name]] there would 1000+ items
- rosters = scrape()
- rates = {'am':48.14,
- 'pm':52.79,
- 'on':34.14,
- 'sat':66.77,
- 'sun':85.45}
- roster_rated = []
- for roster in rosters:
- mornings = create_datelist(roster[0],roster[1],6,20)
- evenings = create_datelist(roster[0],roster[1],20,0)
- over_nights = create_datelist(roster[0],roster[1],0,6)
- if roster[1].hour == 0:#adjust for midnight
- roster[1] += timedelta(days=1)
- sat = 0
- sun = 0
- am = 0
- pm = 0
- on = 0
- if roster[0].weekday() == 5:
- saturdays = create_datelist(roster[0], roster[1], 0, 6, sat=True)
- for saturday in saturdays:
- sat += time_intersect(roster[0], roster[1], saturday[0], saturday[1])
- elif roster[0].weekday() == 6:
- sundays = create_datelist(roster[0], roster[1], 0, 6, sun=True)
- for sunday in sundays:
- sun += time_intersect(roster[0], roster[1], sunday[0], sunday[1])
- else:
- for morning in mornings:
- am += time_intersect(roster[0], roster[1], morning[0], morning[1])
- for evening in evenings:
- pm += time_intersect(roster[0], roster[1], evening[0], evening[1])
- for over_night in over_nights:
- on += time_intersect(roster[0], roster[1], over_night[0], over_night[1])
- roster.extend([am,am*rates['am'],pm,pm*rates['pm'],on,on*rates['on'],sat,sat*rates['sat'],sun,sun*rates['sun']])
- roster_rated.append(roster)
- with open('roster_rated.csv', 'w', newline='') as f:
- writer = csv.writer(f)
- for each in roster_rated:
- writer.writerow(each)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement