Страницы: 1
RSS
Начало и конец графиков процесса в одном столбце
 
Здравствуйте, уважаемые форумчане. Есть циклический производственный процесс и три параметра, которые записываются в столбцы, также записывается дата. Необходимо выбрать время и дату начала и конца графиков каждого процесса, записать их в строки. Начал на Power Query, завесил EXCEL, начал думать про пути обхода, завесил себя
 
Здравствуйте, покажите один процесс как должно быть.
Вредить легко, помогать трудно.
 
Причесал немного в PowerQuery, это быстро делает, справа от основной таблицы, как хотелось бы. Еще хотелось бы научится удалять строки с пустыми значениями одновременно всех 3-х параметров, но одну оставлять для разделения процессов, чтобы сократить объем
 
Electric_80, в Вашем коде Table.Alternate для чего? Или Вы не понимаете, что делает эта функция?
Описание ужасное :) Погадаем:
Код
let
  data = Csv.Document (
    File.Contents ( "C:\Users\kovalev.i\Downloads\TRENDN17\TRENDN17.csv" ),
    [ Delimiter = ",", Columns = 6, Encoding = 1251, QuoteStyle = QuoteStyle.None ]
  ),
  promHeads = Table.PromoteHeaders ( data, [ PromoteAllScalars = true ] ),
  typed = Table.TransformColumnTypes (
    promHeads,
    {
      { "Trend 1 Time", type datetime },
      { "Trend 2 Time", type datetime },
      { "Trend 3 Time", type datetime },
      { "Trend 1 ValueY", type number },
      { "Trend 2 ValueY", type number },
      { "Trend 3 ValueY", type number }
    }
  ),
  addInd = Table.AddColumn ( typed, "process ind", each [Trend 1 ValueY] <> 0 or [Trend 2 ValueY] <> 0 or [Trend 3 ValueY] <> 0, type logical ),
  group = Table.Group (
    addInd,
    { "process ind" },
    {
      { "Дата", ( t ) => Date.From ( List.Min ( t[Trend 1 Time] ) ), type date },
      { "Trend 1 start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY] <> 0 )[Trend 1 Time] ) ), type time },
      { "Trend 1 end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY] <> 0 )[Trend 1 Time] ) ), type time },
      { "Trend 2 start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY] <> 0 )[Trend 2 Time] ) ), type time },
      { "Trend 2 end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY] <> 0 )[Trend 2 Time] ) ), type time },
      { "Trend 3 start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY] <> 0 )[Trend 3 Time] ) ), type time },
      { "Trend 3 end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY] <> 0 )[Trend 3 Time] ) ), type time }
    },
    GroupKind.Local
  ),
  filter = Table.SelectRows ( group, each ( [process ind] = true ) ),
  delInd = Table.RemoveColumns ( filter, { "process ind" } )
in
  delInd
 
Благороднейший сэр Кенни, вы во всем правы, я косноязычный профан в Excel, макросах и тп, неожиданно возникла такая задача выдернуть и преобразовать данные из WINCC. Огромнейшее спасибо, все получилось!
Изменено: Electric_80 - 08.07.2022 13:21:09
 
Начал переделывать, тоже самое для другого процесса, только с двумя параметрами, опять не получается, вроде тоже самое. Как сделать фильтр, чтобы удалялись строки, если значения разницы [Trend 2 end] -  [Trend 2 start] меньше 10 минут и как сделать замену значений в столбце, если больше нуля, то 1? Файл сюда не вмещается https://cloud.mail.ru/public/Gzbm/xo2tTaicL
Код
let
  data = Csv.Document(File.Contents("C:\Users\Пользователь\Desktop\DCCCqUAF\Новая папка\FLAVOR.csv"),[Delimiter=",", Columns=6, Encoding=1251, QuoteStyle=QuoteStyle.None]),
    promHeads = Table.PromoteHeaders(data, [PromoteAllScalars=true]),
    #"Удаленные верхние строки" = Table.Skip(promHeads,1000),
    #"Измененный тип" = Table.TransformColumnTypes(#"Удаленные верхние строки",{{"Trend 1 Time", type datetime}, {"Trend 2 Time", type datetime}}),
    #"Разделить столбец по переходам символов" = Table.SplitColumn(#"Измененный тип", "Trend 1 ValueY", Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Trend 1 ValueY.1", "Trend 1 ValueY.2"}),
    #"Разделить столбец по переходам символов1" = Table.SplitColumn(#"Разделить столбец по переходам символов", "Trend 2 ValueY", Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Trend 2 ValueY.1", "Trend 2 ValueY.2"}),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Разделить столбец по переходам символов1",{"Trend 1 ValueY.2", "Trend 2 ValueY.2"}),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Удаленные столбцы",{{"Trend 1 ValueY.1", type number}, {"Trend 2 ValueY.1", type number}}),
    #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип1",{{"Trend 1 ValueY.1", "Trend 1 ValueY"}, {"Trend 2 ValueY.1", "Trend 2 ValueY"}}),
    addInd = Table.AddColumn ( #"Переименованные столбцы", "process ind", each [Trend 1 ValueY] <> 0 or [Trend 2 ValueY] <> 0, type logical ),
    group = Table.Group (
    addInd,
    { "process ind" },
    {
      { "Дата", ( t ) => Date.From ( List.Min ( t[Trend 1 Time] ) ), type date },
      { "Trend 1 start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY] <> 0 )[Trend 1 Time] ) ), type time },
      { "Trend 1 end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY] <> 0 )[Trend 1 Time] ) ), type time },
      { "Trend 2 start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY] <> 0 )[Trend 2 Time] ) ), type time },
      { "Trend 2 end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY] <> 0 )[Trend 2 Time] ) ), type time }
    },
    GroupKind.Local
  ),
  filter = Table.SelectRows ( group, each ( [process ind] = true ) ),
  delInd = Table.RemoveColumns ( filter, { "process ind" } )
in
  delInd
Изменено: Electric_80 - 28.06.2022 16:26:49
 
Разобрался с предыдущей задачей, теперь почти тоже самое, но нужно столбец "Trend 4 ValueY.1" сгруппировать по другому столбцу индентификации, не "process ind", но остальную группировку оставить. Помогите, пожалуйста, люди добрыя
Код
Замена = Table.TransformColumns(#"Измененный тип", {{"Trend 1 ValueY.1", each if _ > 10 then 1 else 0 , type number},{"Trend 2 ValueY.1", each if _ > 2 then 1 else 0 , type number},{"Trend 3 ValueY.1", each if _ > 10 then 1 else 0 , type number},{"Trend 4 ValueY.1", each if _ > 2 then 1 else 0 , type number}}),
    addInd = Table.AddColumn(Замена, "process ind", each [Trend 1 ValueY.1] <> 0 or [Trend 2 ValueY.1] <> 0 or [Trend 3 ValueY.1] <> 0 or [Trend 4 ValueY.1] <> 0, type logical),
    #"Удаленные ошибки" = Table.RemoveRowsWithErrors(addInd, {"process ind"}),
    group = Table.Group (
    #"Удаленные ошибки",
    { "process ind" },
    {
      { "Дата", ( t ) => Date.From ( List.Min ( t[Trend 1 Time] ) ), type date },
      { "Virginia start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] <> 0 )[Trend 1 Time] ) ), type time },
      { "Virginia end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] > 0 )[Trend 1 Time] ) ), type time },
      { "Virginia casing start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] <> 0 )[Trend 2 Time] ) ), type time },
      { "Virginia casing end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] > 0 )[Trend 2 Time] ) ), type time },
      { "Burley start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] <> 0 )[Trend 3 Time] ) ), type time },
      { "Burley end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] <> 0 )[Trend 3 Time] ) ), type time },
      { "Burley casing start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 4 ValueY.1] <> 0 )[Trend 4 Time] ) ), type time },
      { "Burley casing end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 4 ValueY.1] <> 0 )[Trend 4 Time] ) ), type time }
    },
    GroupKind.Local
  )
 
Цитата
Electric_80 написал:
сгруппировать по другому столбцу индентификации
Читаем про Table.Group().
P.S. Из Вашего описания не особо понятно, что вам нужно. Остальную группировку оставить, это как? :)
Если просто поменять столбец, по которому группируем, ссылку дал. Если нет - файл-пример приложите с данными и необходимым результатом.
Изменено: surkenny - 06.07.2022 09:54:19
 
Цитата
написал:
Читаем про  Table.Group() .P.S. Из Вашего описания не особо понятно, что вам нужно. Остальную группировку оставить, это как?  Если просто поменять столбец, по которому группируем, ссылку дал. Если нет - файл-пример приложите с данными и необходимым результатом
Постараюсь объяснить, столбцы в конечной группировке обозначают начало и конец  положительных значений параметров процесса, последний параметр Trend 4 ValueY.1 имеет стадию промывки в течении общего процесса (обозначен красным цветом на приложенном скрине). Поэтому List.Max именно для "Burley casing end" не подойдет, так как окончание процесса произошло раньше или нужен отдельный идентификатор для этого столбца.  
Изменено: Electric_80 - 06.07.2022 10:35:47
 
Понял, что может быть несколько ключевых столбцов, но как сделать, чтобы группировка была не одновременно по всем объявленным ключам, а выборочно? Или как- то сделать разными запросами... Так вот не работает, осекается продолжительность других параметров
Код
Замена = Table.TransformColumns(#"Измененный тип", {{"Trend 1 ValueY.1", each if _ > 10 then 1 else 0 , type number},{"Trend 2 ValueY.1", each if _ > 2 then 1 else 0 , type number},{"Trend 3 ValueY.1", each if _ > 10 then 1 else 0 , type number},{"Trend 4 ValueY.1", each if _ > 2 then 1 else 0 , type number}}),
    addInd = Table.AddColumn(Замена, "process ind", each [Trend 1 ValueY.1] <> 0 or [Trend 2 ValueY.1] <> 0 or [Trend 3 ValueY.1] <> 0, type logical),
    addInd1 = Table.AddColumn(addInd, "process ind1", each [Trend 4 ValueY.1] <> 0, type logical),
    #"Удаленные ошибки" = Table.RemoveRowsWithErrors(addInd1, {"process ind"}),
    group = Table.Group (
    #"Удаленные ошибки",
    { "process ind", "process ind1" },
    {
      { "Дата", ( t ) => Date.From ( List.Min ( t[Trend 1 Time] ) ), type date },
      { "Virginia start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] <> 0 )[Trend 1 Time] ) ), type time },
      { "Virginia end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] > 0 )[Trend 1 Time] ) ), type time },
      { "Virginia casing start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] <> 0 )[Trend 2 Time] ) ), type time },
      { "Virginia casing end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] > 0 )[Trend 2 Time] ) ), type time },
      { "Burley start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] <> 0 )[Trend 3 Time] ) ), type time },
      { "Burley end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] > 0 )[Trend 3 Time] ) ), type time },
      { "Burley casing start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 4 ValueY.1] <> 0 )[Trend 4 Time] ) ), type time },
      { "Burley casing end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 4 ValueY.1] > 0 )[Trend 4 Time] ) ), type time }
    },
    GroupKind.Local
  )
Изменено: Electric_80 - 06.07.2022 12:29:53
 
Electric_80, выложите сюда пример (на худой конец ссылку) Вашего последнего варианта. Я не понимаю по картинкам и обрезкам кода, что Вам нужно.
 
Ссылка Файл Выборка, запрос DCCC, закидывайте все в одну папку. Нужно, чтобы "Burley casing end" был "11:01:33", а не "11:12:58". Прикрепляю график с пометкой
Изменено: Electric_80 - 06.07.2022 12:44:31
 
Electric_80
Так нужно? Вычисляется максимальное ДатаВремя для первой группы подряд идущих единичек в Trend 4 ValueY.1:
Код
  group = Table.Group (
    #"Удаленные ошибки",
    { "process ind" },
    {
      { "Дата", ( t ) => Date.From ( List.Min ( t[Trend 1 Time] ) ), type date },
      { "Virginia start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] <> 0 )[Trend 1 Time] ) ), type time },
      { "Virginia end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 1 ValueY.1] > 0 )[Trend 1 Time] ) ), type time },
      {
        "Virginia casing start",
        ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] <> 0 )[Trend 2 Time] ) ),
        type time
      },
      { "Virginia casing end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 2 ValueY.1] > 0 )[Trend 2 Time] ) ), type time },
      { "Burley start", ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] <> 0 )[Trend 3 Time] ) ), type time },
      { "Burley end", ( t ) => Time.From ( List.Max ( Table.SelectRows ( t, ( r ) => r[Trend 3 ValueY.1] > 0 )[Trend 3 Time] ) ), type time },
      {
        "Burley casing start",
        ( t ) => Time.From ( List.Min ( Table.SelectRows ( t, ( r ) => r[Trend 4 ValueY.1] <> 0 )[Trend 4 Time] ) ),
        type time
      },
      {
        "Burley casing end",
        ( t ) =>
          [
            group = Table.Group (
              t,
              { "Trend 4 ValueY.1" },
              { { "maxDT", ( tbl ) => List.Max ( tbl[Trend 4 Time] ), type datetime } },
              GroupKind.Local
            ),
            filter = Table.SelectRows ( group, each [Trend 4 ValueY.1] = 1 ),
            result = Time.From ( filter{0}?[maxDT]? )
          ][result],
        type time
      }
    },
    GroupKind.Local
  ),

И, наверное, сразу проще фильтровать строки без пустых значений:  
Код
filter = Table.SelectRows ( group, ( r ) => not List.Contains ( Record.FieldValues ( r ), null ) ),
Изменено: surkenny - 06.07.2022 15:51:12
 
8-0 Я думал это невозможно. Великий  surkenny, я глубочайше благодарен Вам за помощь. А то я полез уже в программу ставить ограничение на промывку, что не очень желательно. Спасибо большое, теперь буду стараться понять как это работает.
 
Electric_80,  посмотрите на свой #5 - это что? Приведите сообщение в порядок - удалите цитату.
Страницы: 1
Наверх