Python Network Hours

Question:

Really struggling with this one so any help would be much appreciated.

GOAL – workout the hours between two datetime columns excluding weekends and only taking the hours between the working times of 9 & 17.

Now I have reused a function that I use for network days but the output is wrong and I can’t seem to figure out how to get it working.

As an example I have In my data a start date and end date that are as follows

Start_Date = 2017-07-11 19:33:00
End_Date = 2017/07/12 12:01:00

and the output I’m after is

3.02

However the function I do have is returning 16!

Function below –

    start = pd.Series(start)
    end = pd.Series(end)
    mask = (pd.notnull(start) & pd.notnull(end)) & (start.dt.hour >= 9) & (end.dt.hour <= 17) & (start.dt.weekday < 5) & (end.dt.weekday < 5)
    result = np.empty(len(start), dtype=float)
    result.fill(np.nan)
    result[mask] = np.where((start[mask].dt.hour >= 9) & (end[mask].dt.hour <= 17), (end[mask] - start[mask]).astype('timedelta64[h]').astype(float), 0)
    return result ```
Asked By: LukeWarm

||

Answers:

It looks like what you need is businesstimedelta

import datetime
import businesstimedelta

start = datetime.datetime.strptime("2017-07-11 19:33:00", "%Y-%m-%d %H:%M:%S")
end = datetime.datetime.strptime("2017-07-12 12:01:00", "%Y-%m-%d %H:%M:%S")

# Define a working day rule
workday = businesstimedelta.WorkDayRule(
    start_time=datetime.time(9),
    end_time=datetime.time(17),
    working_days=[0, 1, 2, 3, 4])

businesshours = businesstimedelta.Rules([workday])

# Calculate the difference
diff = businesshours.difference(start, end)

print(diff)

Output:

<BusinessTimeDelta 3 hours 60 seconds>

https://pypi.org/project/businesstimedelta/

Answered By: Override12

So, I really struggled finding out how to apply the above into a function but finally after much banging of the head came up with the below. Sharing for the next person in my situation. I wanted to convert to minutes so if not required just remove the *60 at the return

import datetime
import businesstimedelta

# Define a working day
workday = businesstimedelta.WorkDayRule(
    start_time=datetime.time(9),
    end_time=datetime.time(17),
    working_days=[0, 1, 2, 3, 4])

# Combine the two
businesshrs = businesstimedelta.Rules([workday])


def business_Mins(df, start, end):
    try:
        mask = pd.notnull(df[start]) & pd.notnull(df[end])
        result = np.empty(len(df), dtype=object)
        result[mask] = df.loc[mask].apply(lambda x: businesshrs.difference(x[start],x[end]).hours, axis=1)
        result[~mask] = np.nan
        return result * 60
    except KeyError as e:
        print(f"Error: One or more columns not found in the dataframe - {e}")
        return None


df['Contact_SLA'] = business_Mins(df, 'Date and Time of Instruction', 'Date and Time of Attempted Contact')
Answered By: LukeWarm
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.