IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Power BI Discussion :

Time Intellignece heure par heure?


Sujet :

Power BI

  1. #1
    Candidat au Club
    Homme Profil pro
    Chomeur
    Inscrit en
    février 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : février 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Time Intellignece heure par heure?
    Bonjour à tous,

    Je travaille actuellement sur des données de consommation de bâtiments et pour la majeure partie des données je me débrouille avec les fonctions "classiques" de Power BI pour regarder l'évolution au mois, à l'année etc. En revanche, certaines données ont un intérêt à être traitées au jour près, et à l'heure notamment et je ne trouve pas de moyen de traiter ces données avec la "time intelligence" (segment de temps etc.)

    Savez-vous s'il existe des moyen de traiter des données en dessous de l'échelle journalière?

    Merci!

  2. #2
    Membre actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    novembre 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2016
    Messages : 184
    Points : 272
    Points
    272
    Par défaut
    Bonjour,

    J'ai assisté à un meet up du club Power BI hier soir qui conseillait justement dans ce cas là d'avoir une table Calendrier et une table d'horaire distincte avec la granularité attendue.

    Il est donc nécessaire d'avoir une colonne date au format date et une colonne heure : min : sec au bon format et distinctes !

  3. #3
    Membre actif Avatar de Tippa
    Homme Profil pro
    Consultant Formateur en Business Intelligence
    Inscrit en
    mars 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Formateur en Business Intelligence

    Informations forums :
    Inscription : mars 2010
    Messages : 122
    Points : 208
    Points
    208
    Par défaut Table de temps
    En effet comme le suggère Braiice, il faudrait idéalement utilisé une table de temps en complément de la table de dates.

    Une table de temps sur 24h, à la minute ou à la seconde selon besoin.
    Ci-dessous un exemple de code M pour créer cette table de temps qu'il faudra relier au champ time de ta table de faits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    let
    //Ci-dessous le code M pour créer une table de temps sur 24h avec précision à la seconde
    //Si les secondes sont inutiles, il est possible de modifier le code pour être en granularité minute
    //Pour une granularité en minute utilisé ci-dessous #duration(0,0,1,0) puisque les paramètres sont #duration(jour, heure, minute, seconde)
    //Pensez aussi à supprimer les colonnes utilisant les secondes pour alléger la table (cf Commentaires en vert)
        Source = List.Times(#time(0,0,0),24*60*60,#duration(0,0,0,1)),//Lister les heures de la journée par seconde
        #"Convertir en Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),//...dans une table
        #"COL HORAIRE" = Table.RenameColumns(#"Convertir en Table",{{"Column1", "Horaire"}}),//Colonne avec heure complète (heure, minute, seconde)
        #"Typage en Heure" = Table.TransformColumnTypes(#"COL HORAIRE",{{"Horaire", type time}}),//...de type heure
        #"Decoupe HEURE" = Table.AddColumn(#"Typage en Heure", "Heure", each Time.Hour([Horaire]), Int64.Type),//Extraire Heure seul de Heure complète
        #"Decoupe Minute" = Table.AddColumn(#"Decoupe HEURE", "Minute", each Time.Minute([Horaire]), Int64.Type),//Extraire Minute seul
        #"Decoupe Seconde" = Table.AddColumn(#"Decoupe Minute", "Seconde", each Time.Second([Horaire]), type number),//Extraire SECONDE seul
        #"COL MATIN AM" = Table.AddColumn(#"Decoupe Seconde", "Matin/AM", each if [Heure] < 12 then "Matin" else "Après-midi"),//Colonne info matin ou AM
        #"Type Modifié" = Table.TransformColumnTypes(#"COL MATIN AM",{{"Matin/AM", type text}}),//...de type texte
        #"COL HEURE 2car" = Table.AddColumn(#"Type Modifié", "Prefix", each "0" & Text.From([Heure], "fr-FR"), type text),//Heure seule sur 2 caractères
        #"Renommer Columns2" = Table.RenameColumns(#"COL HEURE 2car",{{"Prefix", "Heure 2car"}}),//Ajout du 0 en préfixe sur toutes les lignes
        #"Derniers caractères extraits1" = Table.TransformColumns(#"Renommer Columns2", {{"Heure 2car", each Text.End(_, 2), type text}}),//Tronquer les deux derniers caractères sur toutes lignes
        #"COL MINUTE 2car" = Table.AddColumn(#"Derniers caractères extraits1", "Prefix", each "0" & Text.From([Minute], "fr-FR"), type text),//idem que pour les Heure, pour les minutes
        #"Derniers caractères extraits" = Table.TransformColumns(#"COL MINUTE 2car", {{"Heure 2car", each Text.End(_, 2), type text}}),
        #"Renommer Columns3" = Table.RenameColumns(#"Derniers caractères extraits",{{"Prefix", "Minute 2car"}}),
        #"Derniers caractères extraits2" = Table.TransformColumns(#"Renommer Columns3", {{"Minute 2car", each Text.End(_, 2), type text}}),
        #"COL SECONDE 2car" = Table.AddColumn(#"Derniers caractères extraits2", "Prefix", each "0" & Text.From([Seconde], "fr-FR"), type text),//idem que pour les Heures, pour les SECONDE
        #"Renommer Columns4" = Table.RenameColumns(#"COL SECONDE 2car",{{"Prefix", "Seconde 2car"}}),//Transfo SECONDE
        #"Derniers caractères extraits3" = Table.TransformColumns(#"Renommer Columns4", {{"Seconde 2car", each Text.End(_, 2), type text}}),//FIN SECONDE
        #"Ajout Index" = Table.AddIndexColumn(#"Derniers caractères extraits3", "Index", 0, 1),//Création d'un colonne d'index (clé)
        #"Renommer Columns5" = Table.RenameColumns(#"Ajout Index",{{"Index", "TimeKey"}}),
        #"Groupe 12h" = Table.AddColumn(#"Renommer Columns5", "Modulo", each Number.Mod([Heure], 12), Int64.Type),//Regrouper les heures par tranche de 12h (soit 2 groupes par jour)
        #"Renommer Columns6" = Table.RenameColumns(#"Groupe 12h",{{"Modulo", "Heure / 12"}}),
        #"Groupe 8h" = Table.AddColumn(#"Renommer Columns6", "Integer-Division", each Number.IntegerDivide([Heure], 8), Int64.Type),//Regrouper les heures par tranche de 8h (soit 3 groupes par jour)
        #"Renommer Columns7" = Table.RenameColumns(#"Groupe 8h",{{"Integer-Division", "Heure / 8"}}),
        #"Groupe 6h" = Table.AddColumn(#"Renommer Columns7", "Integer-Division", each Number.IntegerDivide([Heure], 6), Int64.Type),//Regrouper les heures par tranche de 6h (soit 4 groupes par jour)
        #"Renommer Columns8" = Table.RenameColumns(#"Groupe 6h",{{"Integer-Division", "Heure / 6"}}),
        #"Groupe 4h" = Table.AddColumn(#"Renommer Columns8", "Integer-Division", each Number.IntegerDivide([Heure], 4), Int64.Type),//Regrouper les heures par tranche de 4h (soit 6 groupes par jour)
        #"Renommer Columns9" = Table.RenameColumns(#"Groupe 4h",{{"Integer-Division", "Heure / 4"}}),
        #"Groupe 3h" = Table.AddColumn(#"Renommer Columns9", "Integer-Division", each Number.IntegerDivide([Heure], 3), Int64.Type),//Regrouper les heures par tranche de 3h (soit 8 groupes par jour)
        #"Renommer Columns10" = Table.RenameColumns(#"Groupe 3h",{{"Integer-Division", "Heure / 3"}}),
        #"Groupe 2h" = Table.AddColumn(#"Renommer Columns10", "Integer-Division", each Number.IntegerDivide([Heure], 2), Int64.Type),//Regrouper les heures par tranche de 2h (soit 12 groupes par jour)
        #"Renommer Columns11" = Table.RenameColumns(#"Groupe 2h",{{"Integer-Division", "Heure / 2"}}),
        #"Groupe 30mn" = Table.AddColumn(#"Renommer Columns11", "Integer-Division", each Number.IntegerDivide([Minute], 30), Int64.Type),//Regrouper les minutes par tranche de 30mn (soit 2 groupes par heure)
        #"Multiplier par 30" = Table.TransformColumns(#"Groupe 30mn", {{"Integer-Division", each _ * 30, type number}}),
        #"Renommer Columns12" = Table.RenameColumns(#"Multiplier par 30",{{"Integer-Division", "Minute / 30"}}),
        #"Groupe 15mn" = Table.AddColumn(#"Renommer Columns12", "Integer-Division", each Number.IntegerDivide([Minute], 15), Int64.Type),//Regrouper les minutes par tranche de 15mn (soit 4 groupes par heure)
        #"Multiplier par 15" = Table.TransformColumns(#"Groupe 15mn", {{"Integer-Division", each _ * 15, type number}}),
        #"Renommer Columns13" = Table.RenameColumns(#"Multiplier par 15",{{"Integer-Division", "Minute / 15"}}),
        #"Groupe 10mn" = Table.AddColumn(#"Renommer Columns13", "Integer-Division", each Number.IntegerDivide([Minute], 10), Int64.Type),//Regrouper les minutes par tranche de 10mn (soit 6 groupes par heure)
        #"Multiplier par 10" = Table.TransformColumns(#"Groupe 10mn", {{"Integer-Division", each _ * 10, type number}}),
        #"Renommer Columns14" = Table.RenameColumns(#"Multiplier par 10",{{"Integer-Division", "Minute / 10"}}),
        //Ci-dessous deux méthodes de calcul pour savoir quelle équipe travaille quand
        //Equipe v1 se base sur le principe Equipe 1 de 0h à 8h, puis Equipe 2 de 8h à 16h, et Equipe 3 de 16h à 24h
        //Cette colonne peut donc être crée directement sur le formulaire de colonne conditionnelle
        #"EQUIPE V1" = Table.AddColumn(#"Renommer Columns14", "Equipes v1", each if [Horaire] < #time(8, 0, 0) then "Equipe 1" else if [Horaire] < #time(16, 0, 0) then "Equipe 2" else if [Horaire] <= #time(23, 59, 59) then "Equipe 3" else "Problème"),
        #"Type modifié" = Table.TransformColumnTypes(#"EQUIPE V1",{{"Equipes v1", type text}}),
        //Equipe v2 se base sur des horaires de travail à cheval pour Equipe de nuit, Equipe de nuit = 22h-->6h, Equipe de jour = 6h-->14h, Equipe du soir = 14h-->22h
        //Pour créer les conditions avec AND, il est nécessaire de saisir manuellement le AND dans l'Editeur Avancé de PQuery (donc impossible avec le formulaire de colonne conditionnelle)
        #"EQUIPE v2" = Table.AddColumn(#"Type modifié", "Equipe v2", each if [Horaire] < #time(6, 0, 0) then "Equipe Nuit" else if [Horaire] >= #time(6, 0, 0) and [Horaire] < #time(14, 0, 0) then "Equipe Jour" else if [Horaire] >= #time(14, 0, 0) and [Horaire] < #time(22, 0, 0) then "Equipe Soir" else if [Horaire] >= #time(22, 0, 0) then "Equipe Nuit" else "Problème"),
        #"Type modifié1" = Table.TransformColumnTypes(#"EQUIPE v2",{{"Equipe v2", type text}}),
        //Création d'une colonne pour savoir si on est en horaire de nuit ou de jour (Possible de remplacer les textes par 0 ou 1)
        #"HEURE de JOUR" = Table.AddColumn(#"Type modifié1", "Heures de JOUR", each if [Horaire] >= #time(7, 0, 0) and [Horaire] < #time(21, 0, 0) then 1 else 0),
        #"HEURE de NUIT" = Table.AddColumn(#"HEURE de JOUR", "Heures de NUIT", each if [Horaire] < #time(7, 0, 0) or [Horaire] >= #time(21, 0, 0) then 1 else 0),
        #"Type modifié2" = Table.TransformColumnTypes(#"HEURE de NUIT",{{"Heures de JOUR", Int64.Type}, {"Heures de NUIT", Int64.Type}})
    in
        #"Type modifié2"
    Tu peux évidemment adapter ce code selon besoin, j'ai mis des notions de jour (7h à 21h) vs nuit et d'équipe qui ne seront peut-être pas utile dans ton cas, mais peut-être à adapter pour tarif de nuit et de jour...

    J'espère que cela peut t'aider.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo