Thank you, Chris. This is a really helpful tutorial. Please can you also show me how to create an offset month, Quarter Year based on your calendar?
Below is the screenshot of my advanced editor.
Thanks
let
Source = #table(
type table
[
#"PeriodStart" = date,
#"PeriodEnd" = date
],
{
//Calendar 2021-2023
{ #date ( 2021, 01, 01 ), #date ( 2021, 01, 30 ) },
{ #date ( 2021, 01, 31 ), #date ( 2021, 02, 27 ) },
{ #date ( 2021, 02, 28 ), #date ( 2021, 04, 03 ) },
{ #date ( 2021, 04, 04 ), #date ( 2021, 05, 01 ) },
{ #date ( 2021, 05, 02 ), #date ( 2021, 05, 29 ) },
{ #date ( 2021, 05, 30 ), #date ( 2021, 06, 30 ) },
{ #date ( 2021, 07, 01 ), #date ( 2021, 07, 31 ) },
{ #date ( 2021, 08, 01 ), #date ( 2021, 08, 28 ) },
{ #date ( 2021, 08, 29 ), #date ( 2021, 10, 02 ) },
{ #date ( 2021, 10, 03 ), #date ( 2021, 10, 30 ) },
{ #date ( 2021, 10, 31 ), #date ( 2021, 11, 27) },
{ #date ( 2021, 11, 28 ), #date ( 2021, 12, 31 ) },
{ #date ( 2022, 01, 01 ), #date ( 2022, 01, 29 ) },
{ #date ( 2022, 01, 30 ), #date ( 2022, 02, 26 ) },
{ #date ( 2022, 02, 27 ), #date ( 2022, 04, 02 ) },
{ #date ( 2022, 04, 03 ), #date ( 2022, 04, 30 ) },
{ #date ( 2022, 05, 01 ), #date ( 2022, 05, 28 ) },
{ #date ( 2022, 05, 29 ), #date ( 2022, 06, 30 ) },
{ #date ( 2022, 07, 01 ), #date ( 2022, 07, 30 ) },
{ #date ( 2022, 07, 31 ), #date ( 2022, 08, 27 ) },
{ #date ( 2022, 08, 28 ), #date ( 2022, 10, 01 ) },
{ #date ( 2022, 10, 02 ), #date ( 2022, 10, 29 ) },
{ #date ( 2022, 10, 30 ), #date ( 2022, 11, 26) },
{ #date ( 2022, 11, 27 ), #date ( 2022, 12, 31 ) }
}
),
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each List.Transform( { Number.From ( [PeriodStart] ) ..Number.From ( [PeriodEnd] ) }, each Date.From (_) )),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Period Number", each if Number.Mod([Index], 12) = 0 then 12 else Number.Mod([Index], 12)),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "CurrentDate", each DateTime.Date(DateTime.FixedLocalNow())),
#"Duplicated Column" = Table.DuplicateColumn(#"Added Custom2", "CurrentDate", "CurrentDate - Copy"),
#"Extracted Year" = Table.TransformColumns(#"Duplicated Column",{{"CurrentDate - Copy", Date.Year, Int64.Type}}),
#"Duplicated Column1" = Table.DuplicateColumn(#"Extracted Year", "PeriodEnd", "PeriodEnd - Copy"),
#"Calculated Start of Month" = Table.TransformColumns(#"Duplicated Column1",{{"PeriodEnd - Copy", Date.StartOfMonth, type date}}),
#"Renamed Columns" = Table.RenameColumns(#"Calculated Start of Month",{{"PeriodEnd - Copy", "StartofMonth"}}),
#"Added Conditional Column" = Table.AddColumn(#"Renamed Columns", "Month", each if [Period Number] = 1 then "January" else if [Period Number] = 2 then "February" else if [Period Number] = 3 then "March" else if [Period Number] = 4 then "April" else if [Period Number] = 5 then "May" else if [Period Number] = 6 then "June" else if [Period Number] = 7 then "July" else if [Period Number] = 8 then "August" else if [Period Number] = 9 then "September" else if [Period Number] = 10 then "October" else if [Period Number] = 11 then "November" else if [Period Number] = 12 then "December" else "Undefined"),
#"Duplicated Column2" = Table.DuplicateColumn(#"Added Conditional Column", "Month", "Month - Copy"),
#"Split Column by Position" = Table.SplitColumn(#"Duplicated Column2", "Month - Copy", Splitter.SplitTextByRepeatedLengths(3), {"Month - Copy.1", "Month - Copy.2", "Month - Copy.3"}),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Position",{{"Month - Copy.1", type text}, {"Month - Copy.2", type text}, {"Month - Copy.3", type text}}),
#"Renamed Columns1" = Table.RenameColumns(#"Changed Type",{{"Month - Copy.1", "MON"}}),
#"Removed Columns" = Table.RemoveColumns(#"Renamed Columns1",{"Month - Copy.2", "Month - Copy.3"}),
#"Renamed Columns2" = Table.RenameColumns(#"Removed Columns",{{"Custom", "Date"}}),
#"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns2",{{"Date", type date}}),
#"Added Custom3" = Table.AddColumn(#"Changed Type1", "Custom", each if [Period Number]>= 1 then Date.Year([Date]) - 1 else Date.Year([Date]))
in
#"Added Custom3"