Power Query Afficher N° semaine ISO dans requête Power Query

SPEA

XLDnaute Occasionnel
Bonjour,
j'ai une requête Power query qui me permet de concatener plusieurs tables et je voudrais ajouter une colonne comportant le N° de semaine ISO pour chaque date.
La fonction Date.WeekOfYear numérote suivant le standard Americain et il n'y a apparemment pas l'équivalent pour la norme ISO 8601.

Y a t'il une astuce pour avoir le N° de semaine ISO, ou si quelqu'un a une table de temps dynamique sympa je suis preneur (N° semaine ISO, Mois, Trimestre, jours ouvrés, etc...).

Merci.
 

SPEA

XLDnaute Occasionnel
Bonjour,

voici pour un exemple de table dynamique de dates et numéro semaine iso, trimestre etc

Source : https://www.developpez.net/forums/d...wer-bi/modele-table-dates-code-m-num-sem-iso/

cordialement
Bonjour,

J'avais trouvé cette source mais dans ce cas il faut renseigner la date de début et la date de fin, je voudrais que ces dates se modifient dynamiquement en fonction du champs date de ma table de données.

J'ai trouvé le modèle qui me serait adapté mais c'est payant :-(
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

J'ai trouvé le modèle qui me serait adapté mais c'est payant

Alors il faut vous y coller.

Voici une fonction pour la semaine iso que vous pouvez appeler en ajoutant une colonne.
VB:
(DateRef as date) =>
let
        Jeudi = Date.AddDays(DateRef, -Date.DayOfWeek(DateRef,1) + 3),
        UnJanvier = #date(Date.Year(Jeudi),1,1),
        EcartJours = Duration.Days(Duration.From(Jeudi - UnJanvier)),
        SemaineISO=  Number.RoundDown(EcartJours/7)+1
in
    SemaineISO

Créez une nouvelle requête vide, affichage 'Editeur avancé'.
Supprimez les lignes écrites automatiquement par PQ et collez le texte de la fonction ci-dessus.
Fermez et nommez votre requête 'fnNumSemaineISO'

Dans votre requête, insérez une étape avec pour formule (adapter les parties en gras à votre contexte):

=Table.AddColumn(#"Nom étape précédente", "Nom de la nouvelle colonne", each fnSemaineISO([Nom Colonne de Dates]))


Cordialement.
 
Dernière édition:

SPEA

XLDnaute Occasionnel
Bonjour,



Alors il faut vous y coller.

Voici une fonction pour la semaine iso que vous pouvez appeler en ajoutant une colonne.
VB:
(DateRef as date) =>
let
        Jeudi = Date.AddDays(DateRef, -Date.DayOfWeek(DateRef,1) + 3),
        UnJanvier = #date(Date.Year(Jeudi),1,1),
        EcartJours = Duration.Days(Duration.From(Jeudi - UnJanvier)),
        SemaineISO=  Number.RoundDown(EcartJours/7)+1
in
    SemaineISO

Créez une nouvelle requête vide, affichage 'Editeur avancé'.
Supprimez les lignes écrites automatiquement par PQ et collez le texte de la fonction ci-dessus.
Fermez et nommez votre requête 'fnNumSemaineISO'

Dans votre requête, insérez une étape avec pour formule (adapter les parties en gras à votre contexte):

=Table.AddColumn(#"Nom étape précédente", "Nom de la nouvelle colonne", each fnSemaineISO([Nom Colonne de Dates]))


Cordialement.
Super merci Roblochon, ca marche impec 👍
 

Ommagawi

XLDnaute Junior
Bonjour Roblochon,
J'ai un problème avec ma requete Query : elle ne prend pas ma table SESSION !!!
Ci-joint mon fichier.
Je voudrais faire une requete avec les 3 tables SESSION, FORMATEUR et STAGIAIRE.
Chaque fois que je veux ajouter la table SESSION, la requete se ferme ?
Où est le problème ?
Merci de bien vouloir m'éguiller.
 

Pièces jointes

  • ESSAI Requête Query.xlsm
    50.6 KB · Affichages: 7

merinos

XLDnaute Accro
Je me suis amusé a créer le query pour employer ceci dans le datamodel...

donc voici le calendrier...

Code:
// modification simple du code trouvé 
//https://www.developpez.net/forums/d2060820/logiciels/solutions-d-entreprise/business-intelligence/microsoft-bi/power-bi/modele-table-dates-code-m-num-sem-iso/
//let
//CreateDateTable = (StartDate as date, EndDate as date, optional Culture as nullable text) as table =>
let
StartDate = Date.FromText("01/01/2005") , //Date.From(38353),
EndDate= Date.FromText("01/01/2030") , //Date.From(47848),
Culture= "en-US",
//Culture= "fr-BE",


//Calcul du nombre de jours du calendrier
DayCount = Duration.Days(Duration.From(EndDate - StartDate)),
//lister les dates pour la durée et créer la table
Source = List.Dates(StartDate,DayCount,#duration(1,0,0,0)),
TableFromList = Table.FromList(Source, Splitter.SplitByNothing()),
//Application du format date à la colonne crée et renommage
ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type date}}),
RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "DateRef"}}),
//Année à 4 caractères
InsertYear = Table.AddColumn(RenamedColumns, "Annee", each Date.Year([DateRef])), ChangeType1=Table.TransformColumnTypes(InsertYear,{{"Annee", Int64.Type}}),
//Trimestre chiffre seul
InsertQuarter = Table.AddColumn(ChangeType1, "Trimestre", each
Date.QuarterOfYear([DateRef])), ChangeType2=Table.TransformColumnTypes(InsertQuarter,{{"Trimestre", Int64.Type}}),
//N° Mois (de 1 à 12)
InsertMonth = Table.AddColumn(ChangeType2, "MoisNum", each Date.Month([DateRef])), ChangeType3=Table.TransformColumnTypes(InsertMonth,{{"MoisNum", Int64.Type}}),
//Jour du mois
InsertDay = Table.AddColumn(ChangeType3, "JourMois", each Date.Day([DateRef])), ChangeType4=Table.TransformColumnTypes(InsertDay,{{"JourMois", Int64.Type}}),
//Date en nombre ISO
InsertDayInt = Table.AddColumn(ChangeType4, "DateNombreISO", each [Annee] * 10000 + [MoisNum] * 100 + [JourMois]), ChangeType7=Table.TransformColumnTypes(InsertDayInt,{{"DateNombreISO", Text.Type}}),
//Nom du mois
InsertMonthName = Table.AddColumn(ChangeType7, "MoisNom", each Date.ToText([DateRef], "MMMM", Culture)), ChangeType8=Table.TransformColumnTypes(InsertMonthName,{{"MoisNom", Text.Type}}),
//N° Mois à deux chiffres
InsertMonthNum2 = Table.AddColumn(ChangeType8, "MoisNum2", each Date.ToText([DateRef], "MM", Culture)), ChangeType9=Table.TransformColumnTypes(InsertMonthNum2,{{"MoisNum2", Text.Type}}),
//Année-Mois
InsertYearMonth = Table.AddColumn(ChangeType9, "Annee-Mois", each Date.ToText([DateRef], "yyyy-MM", Culture)), ChangeType10=Table.TransformColumnTypes(InsertYearMonth,{{"Annee-Mois", Text.Type}}),
//Nom du mois et année
InsertCalendarMonth = Table.AddColumn(ChangeType10, "MoisNomAnnee", each (try(Text.Range([MoisNom],0,4)) otherwise [MoisNom]) & " " & Number.ToText([Annee])), ChangeType11=Table.TransformColumnTypes(InsertCalendarMonth,{{"MoisNomAnnee", Text.Type}}),
//Année-Trimestre (préfixé d'un T)
InsertCalendarQtr = Table.AddColumn(ChangeType11, "Annee-Trimestre", each Number.ToText([Annee]) & " T" & Number.ToText([Trimestre])), ChangeType12=Table.TransformColumnTypes(InsertCalendarQtr,{{"Annee-Trimestre", Text.Type}}),
//Jour de la semaine (numérique)
InsertDayWeek = Table.AddColumn(ChangeType12, "JourSemaineNum", each
Date.DayOfWeek([DateRef])), ChangeType6=Table.TransformColumnTypes(InsertDayWeek,{{"JourSemaineNum", Int64.Type}}),
//Nom du Jour de la semaine (langue selon culture ou langue de Windows)
InsertDayName = Table.AddColumn(ChangeType6, "JourSemaineNom", each Date.ToText([DateRef], "dddd", Culture), type text),
//Calcul du jour de fin de semaine
InsertWeekEnding = Table.AddColumn(InsertDayName, "DateFinSemaine", each Date.EndOfWeek([DateRef]), type date),
//Calcul du jour de fin de mois
InsertMonthEnding = Table.AddColumn(InsertWeekEnding, "DateFinMois", each Date.EndOfMonth([DateRef]), type date),
//Calcul numéro de semaine ISO (Europe) en 4 étapes
//1. Determiner la date du jeudi-Thursday de la semaine en cours
InsertCurrThursday = Table.AddColumn(InsertMonthEnding, "CurrThursday", each Date.AddDays([DateRef], -Date.DayOfWeek([DateRef],1) + 3), type date),
//2. Determiner le 1er janvier de la date (cf étape 1)
InsertFirstJan = Table.AddColumn(InsertCurrThursday, "FirstJan", each
#date(Date.Year([CurrThursday]),1,1),type date),
//3. Calculer le nombre de jours entre le 1er janvier et le jeudi (cf étape 1)
InsertDuration= Table.AddColumn(InsertFirstJan, "Duration", each Duration.Days(Duration.From([CurrThursday] - [FirstJan])), type number),
//4. Diviser le nombre de jours calculé à l'étape 3 par 7, arrondir en dessous et ajouter 1
InsertISOWeekNum = Table.AddColumn(InsertDuration, "NumSemISO", each Number.RoundDown([Duration]/7)+1), ChangeType5=Table.TransformColumnTypes(InsertISOWeekNum,{{"NumSemISO", Int64.Type}}),
//Supprimer les colonnes de calculs inutiles
RemovedColumns = Table.RemoveColumns(ChangeType5, {"CurrThursday","FirstJan","Duration"})
in
RemovedColumns
//in
//CreateDateTable

pas mal comme systeme...
 

chris

XLDnaute Barbatruc
Bonjour Roblochon,
J'ai un problème avec ma requete Query : elle ne prend pas ma table SESSION !!!
Ci-joint mon fichier.
Je voudrais faire une requete avec les 3 tables SESSION, FORMATEUR et STAGIAIRE.
Chaque fois que je veux ajouter la table SESSION, la requete se ferme ?
Où est le problème ?
Merci de bien vouloir m'éguiller.
 

Nicolas Nol

XLDnaute Nouveau
Bonjour,



Alors il faut vous y coller.

Voici une fonction pour la semaine iso que vous pouvez appeler en ajoutant une colonne.
VB:
(DateRef as date) =>
let
        Jeudi = Date.AddDays(DateRef, -Date.DayOfWeek(DateRef,1) + 3),
        UnJanvier = #date(Date.Year(Jeudi),1,1),
        EcartJours = Duration.Days(Duration.From(Jeudi - UnJanvier)),
        SemaineISO=  Number.RoundDown(EcartJours/7)+1
in
    SemaineISO

Créez une nouvelle requête vide, affichage 'Editeur avancé'.
Supprimez les lignes écrites automatiquement par PQ et collez le texte de la fonction ci-dessus.
Fermez et nommez votre requête 'fnNumSemaineISO'

Dans votre requête, insérez une étape avec pour formule (adapter les parties en gras à votre contexte):

=Table.AddColumn(#"Nom étape précédente", "Nom de la nouvelle colonne", each fnSemaineISO([Nom Colonne de Dates]))


Cordialement.
Bonjour,

je pense avoir bien suivi vos conseils, néanmoins la colonne ajoutée me renvoie ERROR
j'ai créé une requete qui devient une fonction suite a la copie de votre code puis j'ajoute une colonne s'appelant "Creation week" dans laquelle je tape le code :
Table.AddColumn([Personnalisée ajoutée], [Creation week] , each fnNumSemaineISO([Creation date]))

Personnalisée ajoutée etant le nom de l'etape précedente

auriez vous une idée de retour ERROR?

merci par avance pour votre aide
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour

Le deuxième paramètre de Table.AddColumn doit être le nom de la colonne (chaîne de caractère entre guillemets)

Table.AddColumn([Personnalisée ajoutée], "Creation week" , each fnNumSemaineISO([Creation date]))

Références des fonctions (parfois obscure comme d'habitude chez microsoft mais utile) :

Cordialement
 

Nicolas Nol

XLDnaute Nouveau
Bonjour

Le deuxième paramètre de Table.AddColumn doit être le nom de la colonne (chaîne de caractère entre guillemets)

Table.AddColumn([Personnalisée ajoutée], "Creation week" , each fnNumSemaineISO([Creation date]))

Références des fonctions (parfois obscure comme d'habitude chez microsoft mais utile) :


Cordialement
Bonjour,

Super cela fonctionne maintenant.
Merci bcp pour votre aide et réactivité.

Cdlt
 

Discussions similaires

Statistiques des forums

Discussions
312 153
Messages
2 085 802
Membres
102 981
dernier inscrit
fred02v