Home » Find Nth Weekday After Date

Find Nth Weekday After Date

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))))))

&&&

Leave a Reply