Forum Discussion
College Class Schedule Analysis
Here's what I built in Power BI.
Hi,
I'm working on a similar task and would like to see how you build it in Power BI.
Thanks!
Lan
- Anonymous6 years agoNot applicable
I ended up taking the section start and end times and creating one row for each minute of the section. I did this by duplicating the columns for start and end times and changing them to a whole number format, then I added a column that extrapolated that by using a custom column with the following formula: {[SSRMEET_BEGIN_TIME]..[SSRMEET_END_TIME]} which creates a row for each value between the times. For example, a 1000 start to 1150 finish would give you all values between 1,000 and 1,150 for that section. You can then filter out any values where the last two characters are greater than 59 (to eliminate 1075, for example, which obviously isn’t a time value).
I also added a time table (see code below) to link the scheduling data to and used that table, along with counts to create a matrix visual with conditional formatting (see photo). I used a hierarchy so you can drill down from hour to half hour, quarter hours and even down to the minute. This allows you to see all of the overlap for the times. Let me know if this make sense!
Code for time table: You’ll need to add this into a blank query
let CreateTimeTable = () as table => let // Similar to our CreateDateTable script, we start with the smallest unit of the dimension, minute // There are a fixed number of minutes in a day, so no need for parameters here // 525,600 minutes divided by 365 days in a year = 1440 minutes in a day. // Who says we never learn from Broadway musicals? MinuteCount = 1440, // Now create a Time type list for a total of 1440 minutes, incrementing one minute at a time Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)), // Turn that list into a one column table TableFromList = Table.FromList(Source, Splitter.SplitByNothing()), // Change that table's one column to type Time ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type time}}), // Rename column to Time RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}), // Start inserting columns for each unit of time to represent in the dimension InsertHour = Table.AddColumn(RenamedColumns, "Hour", each Time.StartOfHour([Time])), InsertMinute = Table.AddColumn(InsertHour, "Minute", each Time.Minute([Time])), ChangedTypeHour = Table.TransformColumnTypes(InsertMinute,{{"Hour", type time}}), // Creating levels in the hierarchy that might be useful for reporting. Omit if not useful to yours InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "Quarter Hour", each if [Minute]<15 then [Hour] else if [Minute] < 30 then Value.Add([Hour],#duration(0,0,15, 0)) else if [Minute] < 45 then Value.Add([Hour],#duration(0,0,30, 0)) else Value.Add([Hour],#duration(0,0,45, 0))), ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour,{{"Quarter Hour", type time}}), ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr,{"Time", "Hour", "Quarter Hour", "Minute"}), InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time])), NextHour = Table.AddColumn(InsertHourNumber, "Next Hour", each Value.Add([Hour],#duration(0,1,0, 0))), NextQuarterHour = Table.AddColumn(NextHour, "Next Quarter Hour", each Value.Add([Quarter Hour],#duration(0,0,15, 0))), InsertPeriod = Table.AddColumn(NextQuarterHour, "Period of Day", each if [Hour Number] >= 0 and [Hour Number] < 4 then "After Midnight" else if [Hour Number] >= 4 and [Hour Number] < 8 then "Early Morning" else if [Hour Number] >= 8 and [Hour Number] < 12 then "Late Morning" else if [Hour Number] >= 12 and [Hour Number] < 16 then "Afternoon" else if [Hour Number] >= 16 and [Hour Number] < 20 then "Evening" else "Late Night"), InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort", each if [Hour Number] >= 0 and [Hour Number] < 4 then 0 else if [Hour Number] >= 4 and [Hour Number] < 8 then 1 else if [Hour Number] >= 8 and [Hour Number] < 12 then 2 else if [Hour Number] >= 12 and [Hour Number] < 16 then 3 else if [Hour Number] >= 16 and [Hour Number] < 20 then 4 else 5), InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text) in InsertTimeKey in CreateTimeTable- lanw6 years agoRegular Visitor
Anonymous
Thank you very much for the detailed information. I'm very new to Power BI and there are a lot things I have to learn. I created the time table with your code, but I don't know on how to add a new column use the formula {[SSRMEET_BEGIN_TIME]..[SSRMEET_END_TIME]}". what I did is choose Add Column in Query Editor, Column from Examples, from all columns, then I copied the line {[SSRMEET_BEGIN_TIME]..[SSRMEET_END_TIME]} into the new added column, it shows something as below and the new column seems merged.
= Table.AddColumn(#"Changed Type", "Merged", each Text.Combine({" {[SSRMEET_BEGI", [Mon], "_TIME]..[SSRMEET_E", [Mon], "D_TIME]} "}), type text)
Could you tell me what I did wrong since I'm not really know what's {[SSRMEET_BEGIN_TIME]..[SSRMEET_END_TIME]} means.
Thank you!
Lan
- Anonymous6 years agoNot applicable
You'll want to leave the time table as is. The additional column will be added to your original data table. For example, my original table (let’s call it MySchedule) had columns for each course, with the day of the week it meets, the start time, end time, etc (see attached sample report). In the MySchedule table you'll add the new column with the formula. You'll go to the Power Query Editor (you can get here by clicking the Transform data button in the ribbon), selecting your table in the left-side pane, going to the Add Column tab of the ribbon and selecting Custom Column. This is where you’ll enter your formula using your start and end time columns, creating a new column called 'Meet Times'.
= {[Start_Time_Column]..[End_Time_Column]}
In the example, this formula will create a list of all numbers between 1000 and 1100 for ABC 101. Once you click the top right of that column to expand it, it creates a new row for each value in the list. Then you'll need to filter that list since you'll get non-time values such as 1099.
Then, convert the Meet Times column back to a time value, close out of the query editor and create a relationship between your new, Meet Time, column and the Time Table, Time column.
Hopefully the example report I provided helps it make more sense! Let me know if you have any issues- always happy to help!
- Ratika5 years agoRegular Visitor
Can you please share the sample script with me.