Come calcolare il numero della settimana ISO in Power Query

Tutto inizia con il calcolo dei giorni settimanali. Per impostazione predefinita, la funzione Date.DayOfWeek di Power Query restituisce un numero compreso tra 0 e 6 a partire da domenica. Per restituire il numero del giorno della settimana in base alle regole ISO8601, è necessario aggiungere il valore facoltativo del primo giorno della settimana e modificare la numerazione da 1 a 7. Per questa dimostrazione è stato generato anche un elenco di date.

=Date.DayOfWeek([Date], Day.Monday)+1

Dopo questo piccolo aggiustamento, è possibile calcolare il numero della settimana ISO in Power Query con tutte le condizioni necessarie.

Utilizzando i numeri ISO del giorno della settimana (che vanno da 1 per lunedì a 7 per domenica), sottrarre il giorno della settimana dalla data ordinale, quindi aggiungere 10. Dividere il risultato per 7: il quoziente è uguale al numero della settimana. Se il numero della settimana così ottenuto è uguale a 0, significa che la data appartiene all’anno precedente (basato sulla settimana). Se si ottiene un numero di settimana 53, è necessario verificare che la data non sia effettivamente nella settimana 1 dell’anno successivo.

=if

Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7)=0

then

Number.RoundDown((Date.DayOfYear(#date(Date.Year([Date])-1,12,31))-(Date.DayOfWeek(#date(Date.Year([Date])-1,12,31), Day.Monday)+1)+10)/7)

else if

(Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7)=53

and (Date.DayOfWeek(#date(Date.Year([Date]),12,31), Day.Monday)+1<4))

then

1

else

Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7)

Ecco il codice M da inserire in Blank Query per provare in autonomia:

//datacornering.com

let

    Source = List.Dates(DateTime.Date(DateTime.LocalNow()), 365, #duration(1, 0, 0, 0)),

    #”Converted to Table” = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

    #”Renamed Columns” = Table.RenameColumns(#”Converted to Table”,{{“Column1”, “Date”}}),

    #”Changed Type” = Table.TransformColumnTypes(#”Renamed Columns”,{{“Date”, type date}}),

    #”Weekday Number” = Table.AddColumn(#”Changed Type”, “Weekday Number”, each Date.DayOfWeek([Date], Day.Monday)+1),

    #”ISO Week Number” = Table.AddColumn(#”Weekday Number”, “ISO Week Number”, each if

Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7)=0

then

Number.RoundDown((Date.DayOfYear(#date(Date.Year([Date])-1,12,31))-(Date.DayOfWeek(#date(Date.Year([Date])-1,12,31), Day.Monday)+1)+10)/7)

else if

(Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7)=53

and (Date.DayOfWeek(#date(Date.Year([Date]),12,31), Day.Monday)+1<4))

then

1

else

Number.RoundDown((Date.DayOfYear([Date])-(Date.DayOfWeek([Date], Day.Monday)+1)+10)/7))

in

    #”ISO Week Number”


Le informazioni presenti in questo post, sono prese dall’articolo: http://datacornering.com/how-to-calculate-iso-week-number-in-power-query/