Work out the dates after the dates given in column A by Reference days. Hence, for 2-Jun-23, 5th Friday after 2-Jun-23 will be 7-Jul-23. Note – Dates are in MDY format. Note – 2-Jun-23 itself is a Friday. We need to find the AFTER dates. Hence, when we are calculating 5th Friday, 2-Jun-23 will not be considered even though it is a Friday.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 126
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Find Nth Weekday After Date with Power Query
Power Query solution 1 for Find Nth Weekday After Date, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
S = Table.AddColumn(
Source,
"Reference Date",
each
let
d = Date.From([Date]),
r = [Reference],
o = Duration.From(1),
f = Number.From
in
List.Max(
List.Generate(
() => [D = d + o, N = 0],
each [N] < f(Text.Select(r, {"0" .. "9"})),
each [D = [D] + o, N = [N] + f(Text.Contains(r, Date.DayOfWeekName([D], "en-US")))],
each [D]
)
)
)
in
S
Power Query solution 2 for Find Nth Weekday After Date, proposed by Kris Jaganah:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ExpandDate = Table.ExpandListColumn(Table.AddColumn(Source, "Dates", each List.Dates( Date.From ([Date])+hashtag#duration(1,0,0,0),365,hashtag#duration(1,0,0,0))), "Dates"),
FilterCond = Table.AddColumn(Table.AddColumn(ExpandDate, "Weekday", each Text.AfterDelimiter([Reference]," ")), "Weekday filter", each if Date.DayOfWeekName([Dates])=[Weekday] then 1 else 0),
FilterWeekday = Table.SelectRows(FilterCond, each ([Weekday filter] = 1)),
WeekdayNum = Table.AddColumn(FilterWeekday, "WeekdayOcc", each try Number.From(Text.Start([Reference],2)) otherwise Number.From(Text.Start([Reference],1))),
Group = Table.Group(WeekdayNum, {"Date"}, {{"All", each _, type table [Date=datetime, Reference=text, Dates=date, Weekday=text, Weekday filter=number, WeekdayOcc=number]}}),
Index = Table.AddColumn(Group, "Index", each Table.AddIndexColumn([All],"Index",1)),
ExpandIndex = Table.ExpandTableColumn(Index, "Index", {"Reference", "Dates", "Index", "WeekdayOcc"}, {"Reference", "Reference Date", "Index", "WeekdayNo"}),
Select = Table.SelectColumns(Table.SelectRows(ExpandIndex, each ([Index]=[WeekdayNo])),{"Date", "Reference", "Reference Date"})
in
Select
Power Query solution 3 for Find Nth Weekday After Date, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Sol = Table.AddColumn(
Source,
"Reference Date",
each
let
a = Text.Split([Reference], " "),
b = Number.From(Text.Select(a{0}, {"0" .. "9"})),
c = a{1},
d = Date.AddWeeks([Date], b),
e = List.Transform({Number.From([Date]) + 1 .. Number.From(d)}, Date.From),
f = List.Last(List.Select(e, each Date.DayOfWeekName(_, "En-us") = c))
in
f
)
in
Sol
Power Query solution 4 for Find Nth Weekday After Date, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
res = Table.AddColumn(
Fonte,
"Personalizar",
each [
a1 = Text.Split([Reference], " "),
a = {
Number.From(Date.From([Date])) .. Number.From(
Date.AddWeeks(Date.From([Date]), Number.From(Text.Select([Reference], {"0" .. "9"})))
)
},
b = List.Transform(
a,
each {Date.ToText(Date.From(_))} & {Date.DayOfWeekName(Date.From(_), "en-us")}
),
c = List.Transform(List.Distinct(b), (x) => List.Select(b, each _{1} = x{1})),
d = Table.Distinct(Table.Combine(List.Transform(c, Table.FromRows))),
e = Table.Combine(
Table.Group(d, {"Column2"}, {{"Dia", each Table.AddIndexColumn(_, "Ind", 1, 1)}})[Dia]
),
f = Text.Combine(
Table.SelectRows(
e,
each [Ind] = Number.From(Text.Select(a1{0}, {"0" .. "9"})) and [Column2] = a1{1}
)[Column1]
)
][f]
)
in
res
Power Query solution 5 for Find Nth Weekday After Date, proposed by Hussein SATOUR:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Result = Table.AddColumn(Source, "Custom", each let
a = (try Number.From(Text.Start([Reference], 2)) otherwise
Number.From(Text.Start([Reference], 1))) * 7 + 1,
b = List.Dates(Date.From([Date]), a, hashtag#duration(1,0,0,0)),
c = Text.AfterDelimiter([Reference], " "),
d = List.Select(b, each Date.DayOfWeekName(_) = c)
in List.Last(d))
in Result
Power Query solution 6 for Find Nth Weekday After Date, proposed by Alexis Olson:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source, {{"Date", type date}, {"Reference", type text}}),
#"Added Custom" = Table.AddColumn(
#"Changed Type",
"Reference Date",
each [
ref_num = Number.FromText(Text.Select([Reference], {"0" .. "9"})),
ref_day = Text.AfterDelimiter([Reference], " "),
potential_dates = List.Dates(Date.AddDays([Date], 7 * ref_num - 6), 7, hashtag#duration(1, 0, 0, 0)),
ref_date = List.Select(potential_dates, each Date.ToText(_, [Format = "dddd"]) = ref_day){0}
][ref_date], type date
)
in
#"Added Custom"
Power Query solution 7 for Find Nth Weekday After Date, proposed by Eric Laforce:
let
Source = Excel.CurrentWorkbook(){[Name = "tData126"]}[Content],
ChangeType = Table.TransformColumnTypes(Source, {{"Date", type date}}),
Add_RD = Table.AddColumn(
ChangeType,
"Reference Date",
each
let
_s = Splitter.SplitTextByAnyDelimiter({"st ", "nd ", "rd ", "th "})([Reference]),
_dw1 = Date.DayOfWeek([Date], Day.Monday),
_dw2 = List.PositionOf(
{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"},
_s{1}
),
_d = Date.AddDays([Date], _dw2 - _dw1 + 7 * (Number.From(_s{0}) - Number.From(_dw2 > _dw1)))
in
_d,
type date
)
in
Add_RD
Power Query solution 8 for Find Nth Weekday After Date, proposed by Luke Jarych:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ChangedType = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Reference", type text}}),
AddNextDateColumn = Table.AddColumn(ChangedType, "Reference Date", each
let
RefNumber = Number.FromText(Text.Select([Reference], {"0" .. "9"})),
RefDay = Text.AfterDelimiter([Reference], " "),
AddDays = Date.AddDays([Date], RefNumber),
ListOfDates = List.Dates(Date.AddDays([Date], RefNumber * 7 - 6), 7, hashtag#duration(1,0,0,0)),
SelectRefDate = List.Select(ListOfDates, each Date.ToText(_, "dddd", "en-US") =RefDay){0}
in SelectRefDate)
in
AddNextDateColumn
Power Query solution 9 for Find Nth Weekday After Date, proposed by Sandeep Marwal:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
S1 = Table.TransformColumnTypes(Source,{{"Date", type date}}),
S2 = Table.SplitColumn(S1, "Reference", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Reference.1", "Reference.2"}),
S4 = Table.SplitColumn(S2, "Reference.1", Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Reference.1.1", "Reference.1.2"}),
S5 = Table.RemoveColumns(S4,{"Reference.1.2"}),
S6 = Table.TransformColumnTypes(S5,{{"Reference.1.1", Int64.Type}}),
S7 = Table.AddColumn(S6, "Custom", each List.Dates(Date.AddDays([Date],1),100,hashtag#duration(1,0,0,0))),
S8 = Table.TransformColumns(S7, {"Custom", each Table.FromColumns({_})}),
S9 = Table.FromColumns(
Table.ToColumns(S1) &
{Table.TransformRows(S8, (a) =>
Table.SelectRows(Table.AddIndexColumn(Table.SelectRows(Table.AddColumn(a[Custom], "Day Name", each Date.DayOfWeekName([Column1]), type text), each ([Day Name] = a[Reference.2])), "Index", 1, 1, Int64.Type), each ([Index] = a[Reference.1.1]))[Column1]{0})},{"Date","Reference","Reference Date"}),
S10 = Table.TransformColumnTypes(S9,{{"Reference Date", type date}})
in
S10
Power Query solution 10 for Find Nth Weekday After Date, proposed by Obi E, MPH:
let Source = Excel.CurrentWorkbook(){[Name="Table4"]}[Content], #"Chan - Pastebin.com
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Solving the challenge of Find Nth Weekday After Date with Excel
Excel solution 1 for Find Nth Weekday After Date, proposed by Bo Rydobon 🇹🇭:
=LET(r,B2:B8,s,XMATCH(TEXTAFTER(r," "),TEXT(SEQUENCE(7),"dddd")),FLOOR(A2:A8-s,7)+s+TEXTBEFORE(r,{"s","n","r","t"})*7)
Excel solution 2 for Find Nth Weekday After Date, proposed by Rick Rothstein:
=LET(a,A2:A8,o,TEXTSPLIT(B2:B8,{"s","n","r","t"}),w,(FIND(LEFT(TEXTAFTER(B2:B8," "),2),"SuMoTuWeThFrSa")+1)/2,d,WEEKDAY(a),a-d+w+7*(o-1+(d>=w)))
Excel solution 3 for Find Nth Weekday After Date, proposed by محمد حلمي:
=MAP(A2:A8,B2:B8,LAMBDA(a,b,a+MOD(XMATCH(TRUE,
TEXT(SEQUENCE(7)+1,"dddd")=TEXTAFTER(b," "))-WEEKDAY(a),7)+IFERROR(--LEFT(b,2),LEFT(b))*7-6))
Excel solution 4 for Find Nth Weekday After Date, proposed by محمد حلمي:
=MAP(A2:A8,B2:B8,LAMBDA(a,b,LET(r,SEQUENCE(99,,a+1),
INDEX(FILTER(r,TEXT(r,"dddd")=TEXTAFTER(b," ")),IFERROR(--LEFT(b,2),LEFT(b))))))
Excel solution 5 for Find Nth Weekday After Date, proposed by 🇰🇷 Taeyong Shin:
=WORKDAY.INTL(+E2:E8,REGEXEXTRACT(F2:F8,"d+"),SUBSTITUTE(1111111,1,0,XMATCH(TEXTAFTER(F2:F8," "),TEXT(SEQUENCE(7,,2),"dddd"))))
Excel solution 6 for Find Nth Weekday After Date, proposed by 🇰🇷 Taeyong Shin:
=LET(weekend,BYROW(1-(TEXTAFTER(B2:B8," ")=TEXT(SEQUENCE(,7,2),"dddd")),CONCAT),WORKDAY.INTL(+A2:A8,TEXTSPLIT(B2:B8,{"r","t","n","s"}),weekend))
Excel solution 7 for Find Nth Weekday After Date, proposed by Kris Jaganah:
=MAP(A2:A8,B2:B8,LAMBDA(x,y,LET(a,x+SEQUENCE(365),b,--IFERROR(--LEFT(y,2),LEFT(y)),c,TEXTAFTER(y," "),d,SEQUENCE(7),e,TEXT(d,"dddd"),CHOOSEROWS(FILTER(a,WEEKDAY(a)=XLOOKUP(c,e,d)),b))))
Excel solution 8 for Find Nth Weekday After Date, proposed by Sunny Baggu:
=MAP(
A2:A8,
B2:B8,
LAMBDA(x, y,
LET(
_d, x + SEQUENCE(999),
_ts, TEXTSPLIT(y, {"rd ", "th ", "nd ", "st "}),
_r1, --TAKE(_ts, 1, 1),
_r2, TAKE(_ts, 1, -1),
_day, TEXT(_d, "dddd"),
CHOOSEROWS(FILTER(_d, _day = _r2), _r1)
)
)
)
Excel solution 9 for Find Nth Weekday After Date, proposed by LEONARD OCHEA 🇷🇴:
=REDUCE(HSTACK(A1:B1,"Reference Date"),A2:A8,LAMBDA(a,b,LET(c,OFFSET(b,,1),t,TEXTBEFORE(c," "),n,LEFT(c,LEN(t)-2),d,b+SEQUENCE(n*7),VSTACK(a,HSTACK(b,c,MAX((TEXT(d,"dddd")=TEXTAFTER(c," "))*d))))))
Excel solution 10 for Find Nth Weekday After Date, proposed by Mihai Radu O:
=MAP(A2:A8, B2:B8, LAMBDA(a,b, LET(c, --TEXTBEFORE(b, {"r","s","t","n"}), d, TEXTAFTER(b, " "), e, SWITCH(d, "Monday", 1, "Tuesday", 2, "Wednesday", 3, "Thursday", 4, "Friday", 5, "Saturday", 6, "Sunday", 7), f, CONCAT(IF(SEQUENCE(7) = e, 0, 1)), WORKDAY.INTL(a, c, f))))
Excel solution 11 for Find Nth Weekday After Date, proposed by Ziad A.:
=MAP(A2:A8,B2:B8,LAMBDA(d,r,LET(s,SEQUENCE(99,1,d+1),{d,r,INDEX(FILTER(s,TEXT(s,"ddd")=REGEXEXTRACT(r," (...)")),REGEXEXTRACT(r,"d+"))})))
Excel solution 12 for Find Nth Weekday After Date, proposed by Hazem Hassan:
=MAP(A2:A8,B2:B8,LAMBDA(x,y,LET(a,SEQUENCE(365,,x+1),b,LEFT(y,2),
CHOOSEROWS(FILTER(a,TEXT(a,"dddd")=TEXTAFTER(y," ")),IF(ISNUMBER(1*b),b,LEFT(y,1))))))
&&&
