Heure UTC – Heure d’été / Heure d’hiver

Accueil – Le CFO masqué Forums Power Query Heure UTC – Heure d’été / Heure d’hiver

  • Ce sujet contient 2 réponses, 2 participants et a été mis à jour pour la dernière fois par Daniel Blanc, le il y a 2 mois et 2 semaines.
3 sujets de 1 à 3 (sur un total de 3)
  • Auteur
    Articles
  • #107031
    CopyCat
    Participant

    Bonjour,
    Je travail sur une base de données permettant de suivre le production d’une machine.
    L’automate de la machine remonte les données en UTC(+1). Elles sont ensuite compilées en UTC(0), choix du service IT centrale.
    Avec Power Query je pense être capable de gérer les UTC, mais je ne sais pas comment gérer l’heure d’été (UTC(+1) +1 heure à 02:00 AM le dernier dimanche du mois de mars) et l’heure d’hiver(UTC(+1) à 02:00 AM le dernier dimanche du mois d’octobre.
    Avez-vous une idée?

    #107032
    CopyCat
    Participant

    Je réussi à faire le calcul avec Excel :
    =SI(OU(Tableau1[@[Heure UTC(0)]]+TEMPS(1;0;0)<(DATE(ANNEE(A2);4;)-MOD(DATE(ANNEE(A2);4;)-1;7)+TEMPS(2;0;0));Tableau1[@[Heure UTC(0)]]+TEMPS(1;0;0)>DATE(ANNEE(A2);11;)-MOD(DATE(ANNEE(A2);11;)-1;7)+TEMPS(2;0;0));Tableau1[@[Heure UTC(0)]]+TEMPS(1;0;0);Tableau1[@[Heure UTC(0)]]+TEMPS(1;0;0)+TEMPS(1;0;0))

    En A2 j’ai une date en UTC (0)

    #107109
    Daniel Blanc
    Participant

    Bonjour CopyCat, Le Forum,

    En espérant avoir bien compris, dans l’exemple j’ai deux colonnes une pour les dates et l’autre pour les heures, que je rassemble après (une colonne en entrée devrait suffire).
    – Création d’une colonne Année
    – Grouper sur cette colonne en sélectionnant Toutes les lignes
    – Heure d’été : dernier dimanche du mois de Mars, je suis parti du 01/03/ année de la ligne de donnée, puis je prends le dernier jour du mois de cette date et calcul du dernier dimanche (7-6+jour de la semaine du dernier jour du mois). A cette date, je rajoute le temps soit 2 heures du matin.
    – Heure hiver : même principe que pour Heure été mais en partant du 01/10
    Cette partie peut être simplifiée en partant directement du dernier jour du mois de Mars et d’Octobre

    Début Requête
    let
    Source = Excel.CurrentWorkbook(){[Name=”Tableau2″]}[Content],
    ModificationTypeDonnées = Table.TransformColumnTypes(Source,{{“Date de relevé”, type date}, {“Heure UTC (0)”, type time}}),
    DateHeureReleve = Table.AddColumn(ModificationTypeDonnées, “DateHeureRelevé”, each #datetime(Date.Year([Date de relevé]),Date.Month([Date de relevé]),Date.Day([Date de relevé]),Time.Hour([#”Heure UTC (0)”]),Time.Minute([#”Heure UTC (0)”]),Time.Second([#”Heure UTC (0)”]))),
    AjoutColonneAnnee = Table.AddColumn(DateHeureReleve, “Année”, each Date.Year([Date de relevé]), Int64.Type),
    GroupByAnnee = Table.Group(AjoutColonneAnnee , {“Année”}, {{“AnnéeCalendaire”, each _, type table [Date de relevé=nullable date, #”Heure UTC (0)”=nullable time, Année=number]}}),
    DateDébutEte = Table.AddColumn(GroupByAnnee, “DébutEté”, each Table.AddColumn([AnnéeCalendaire],”DateDébutEté”,each Date.AddDays(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année]))), -(7-6+Date.DayOfWeek(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année])))))))),
    DateFinEte = Table.AddColumn(DateDébutEte, “FinEté”, each Table.AddColumn([DébutEté],”DateFinEté”,each Date.AddDays(Date.EndOfMonth(Date.FromText(“01/10/”&Text.From([Année]))), -(7-6+Date.DayOfWeek(Date.EndOfMonth(Date.FromText(“01/10/”&Text.From([Année])))))),type date)),
    DateTimeDebutEte= Table.AddColumn(DateFinEte, “DateHeureEté”, each Table.AddColumn([FinEté], “DateHeureDebutEte”, each #datetime(Date.Year([DateDébutEté]),Date.Month([DateDébutEté]),Date.Day([DateDébutEté]),Time.Hour(Time.FromText(“02:00:00am”)),Time.Minute(Time.FromText(“02:00:00am”)),Time.Second(Time.FromText(“02:00:00am”))), type datetime)),
    DateTimeFinEte = Table.AddColumn(DateTimeDebutEte, “DateHeureFinEté”, each Table.AddColumn([DateHeureEté], “DateHeureFinEte”, each #datetime(Date.Year([DateFinEté]),Date.Month([DateFinEté]),Date.Day([DateFinEté]),Time.Hour(Time.FromText(“03:00:00am”)),Time.Minute(Time.FromText(“03:00:00am”)),Time.Second(Time.FromText(“03:00:00am”))), type datetime)),
    SuppressionColonnes = Table.SelectColumns(DateTimeFinEte,{“DateHeureFinEté”}),
    DevelopperTableData = Table.ExpandTableColumn(SuppressionColonnes, “DateHeureFinEté”, {“DateHeureRelevé”, “DateHeureDebutEte”, “DateHeureFinEte”}, {“DateHeureRelevé”, “DateHeureDebutEte”, “DateHeureFinEte”}),
    CalculHeuresUTC = Table.AddColumn(DevelopperTableData, “DateHeureRelevé UTC”, each if [DateHeureRelevé] >= [DateHeureDebutEte] and [DateHeureRelevé] <= [DateHeureFinEte] then [DateHeureRelevé]+#duration(0,2,0,0) else [DateHeureRelevé] + #duration(0,1,0,0)),
    SuppressionAutresColonnes = Table.SelectColumns(CalculHeuresUTC,{“DateHeureRelevé UTC”, “DateHeureRelevé”}),
    PermutationColonnes = Table.ReorderColumns(SuppressionAutresColonnes,{“DateHeureRelevé”, “DateHeureRelevé UTC”})
    /*
    Fin du mois Mars = Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année])))
    Jour de fin du mois Mars = Date.DayOfWeek(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année]))))
    Calcul du dernier Dimanche = Date.AddDays(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année]))), -(7-6+Date.DayOfWeek(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année]))))))
    7 : pour 7 jours dans la semaine
    6 : chiffre correspond à dimanche
    Date.DayOfWeek(Date.EndOfMonth(Date.FromText(“01/03/”&Text.From([Année])))) : Jour de la semaine du dernier jour du mois
    HeureChgHeureEte = Time.FromText(“02:00:00am”)
    DateTimeDebutEte= Table.AddColumn(DateDébutEté, “Début Date été”, each #datetime(Date.Year([DateDébutEté]),Date.Month([DateDébutEté]),Date.Day([DateDébutEté]),Time.Hour(Time.FromText(“02:00:00am”)),Time.Minute(Time.FromText(“02:00:00am”)),Time.Second(Time.FromText(“02:00:00am”))), type datetime)
    */
    in
    PermutationColonnes

    Fin Requête

    Cela te donnera au moins des pistes à étudier, cela reste à tester sur un grand nombre de lignes afin de voir la performance et de l’améliorer au besoin.
    Cordialement
    Daniel

    Attachments:
    You must be logged in to view attached files.
3 sujets de 1 à 3 (sur un total de 3)
  • Vous devez être connecté pour répondre à ce sujet.