Страницы: 1
RSS
Интервал между датами в Power Query
 
Доброго времени суток. Подскажите пожалуйста, как в Power Query сделать так, чтоб получить список между датами? Имеется таблица с датами, в ней два набора дат. Первый случай, когда есть интервал между датами, то есть от и до (из него надо сделать список), а второй просто перечисление дат. Файл прилагается. Благодарю.
 
Цитата
Slava977 написал:
есть интервал между датами
В этом случае можно с помощью функции List.Dates().
 
Доброе время суток.
Вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    typed = Table.TransformColumnTypes(Source,{{"Дата", type text}}),
    toSingle = List.Combine(List.Transform(typed[Дата], each Text.Split(_, ","))),
    toIntervals = List.Transform(toSingle, (item) =>
    if Text.Contains(item, "-") then
    let
        scope = Text.Split(item, "-"),
        start = Date.From(scope{0}, "ru-RU"),
        finish = Date.From(scope{1}, "ru-ru")
    in
        List.Dates(start, Duration.TotalDays(finish - start) + 1, #duration(1, 0, 0, 0))
    else
        {Date.From(item, "ru-RU")}
    )
in
    List.Combine(toIntervals)
 
Всем привет. Подскажите, как можно реализовать очень похожую задачу? Необходимо преобразовать в список диапазон дат для каждой строки таблицы. В файле во вложении есть таблица "до" и то, что необходимо получить. Не могу додумать, как можно сделать.
 
Борис13, например, так
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Дата Начала", Int64.Type}, {"Дата Окончания", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Дата", each {[Дата Начала]..[Дата Окончания]}),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Дата Начала", "Дата Окончания"}),
    #"Expanded {0}" = Table.ExpandListColumn(#"Removed Columns", "Дата"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded {0}",{{"Дата", type date}})
in
    #"Changed Type1"
 
Михаил Л, ,благодарю!
 
Подскажите, как можно сделать список с шагом в  месяц? Есть начальная дата и количество месяцев.
 
Glutton, можно и такой список слепить.
Код
let
    StartDate = #date(2021,10,06),
    QuantityOfMonths = 17,
    List = List.Transform( {0..QuantityOfMonths - 1}, each Date.AddMonths( StartDate, _ ) )
in
    List
Вот горшок пустой, он предмет простой...
 
PooHkrd, подскажите, создал столбец по аналогии с кодом выше, но вместо фиксированной даты сделал ссылку на колонку с датой (Период с) и получаю ошибку при разворачивании :

Expression.Error: Не удается применить доступ к полям в типе Number.
Сведения:
   Value=0
   Key=Период с

Что не так?
Задача расширить таблицу между интервалами в разрезе года и месяца. С 1.1.21 по 31.12.25 нужно создать 60 строк (12 мес*5 лет)
 
Цитата
mechanix 85 написал:
в разрезе года и месяца
Создать список дат(месяцев, кварталов, лет) на основании даты начала и окончания периода
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо! заработало!
 
mechanix 85, давайте пример. Подозреваю, что пока его сделаете - сами разберетесь.  ;)
Вот горшок пустой, он предмет простой...
 
с примера Дмитрий(The_Prist) Щербаков разобрался. а вот, что навоял я
 
mechanix 85, предпоследний шаг исправьте:
Код
  #"Добавлен пользовательский объект1" = Table.AddColumn (
    #"Добавлен пользовательский объект", 
    "Пользовательская", 
    each List.Transform ( { 0 .. [Кво мес] }, ( x ) => Date.AddMonths ( [Период с], x ) )
  ), 
 
mechanix 85, понятно, в итераторах запутались. Ну, собственно решение предложено от предыдущего оратора.
Осторожнее нужно с вложенными each.
Вот горшок пустой, он предмет простой...
 
PooHkrd, я с ними пока на Вы
 
mechanix 85, читайте отсюда и пяток постов вниз.
Вообще по изучайте эту тему в курилке, там много полезного.
Вот горшок пустой, он предмет простой...
 
Добрый день. Прошу помочь в решении обратной проблемы:
На входе есть выгрузка типа "Объект" - "Дата".
На выходе надо получить "Объект" - "Начало" - "Окончание" (непрерывные периоды по каждому объекту).

Проблема в том что на каждый объект может выпадать несколько периодов поэтому обычной группировкой собрать из фарша мясо у меня не получилось...  
 
Semen, добрый день!
Проверяйте, с примером совпало, как на реальных данных поведет себя - не ручаюсь  :)
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Данные"]}[Content],
    ChangeType = Table.TransformColumnTypes(Source,{{"Дата", type datetime}}),
    Sort = Table.Sort(ChangeType,{{"Объект", Order.Ascending}, {"Дата", Order.Ascending}}),
    AddIndex = Table.AddIndexColumn(Sort, "Индекс", 0, 1),
    DateBrake = Table.AddColumn(AddIndex, "Пользовательская", each  
        try AddIndex[Дата]{[Индекс]} - #duration(1,0,0,0) = AddIndex[Дата]{[Индекс]-1} otherwise false),
    Group = Table.Group(DateBrake, {"Объект", "Пользовательская"}, 
        {{"Начало", each List.Min([Дата]), type datetime}, 
        {"Конец", each List.Max([Дата]), type datetime}},
        GroupKind.Local, (s,c)=> Number.From(c[Пользовательская] <> true)),
    RemoveColumns = Table.SelectColumns( Group,{"Объект", "Начало", "Конец"}),
    SortAgain = Table.Sort(RemoveColumns,{{"Объект", Order.Ascending}, {"Начало", Order.Ascending}})
in
    SortAgain


upd. Некорректно отрабатывает, если у последнего объекта одна дата и если эта дата уже попадает в какой-то другой объект( или несколько, но эти даты встречались ранее, т.к вижу, что пересечение дат возможно
upd1. Заменил файл и код, так вроде норм все
Изменено: whateverlover - 23.09.2022 16:38:50
 
Цитата
написал:
Semen, добрый день!
Проверяйте, с примером совпало, как на реальных данных поведет себя - не ручаюсь  
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15      let          Source = Excel.CurrentWorkbook(){[Name=  "Данные"  ]}[Content],          ChangeType = Table.TransformColumnTypes(Source,{{  "Дата"  , type datetime}}),          Sort = Table.Sort(ChangeType,{{  "Дата"  , Order.Ascending}, {  "Объект"  , Order.Ascending}}),          AddIndex = Table.AddIndexColumn(Sort,   "Индекс"  , 0, 1),          DateBrake = Table.AddColumn(AddIndex,   "Пользовательская"  , each                try AddIndex[Дата]{[Индекс]} - #duration(1,0,0,0) = AddIndex[Дата]{[Индекс]-1} otherwise true),          Group = Table.Group(DateBrake, {  "Объект"  ,   "Пользовательская"  },               {{  "Начало"  , each List.Min([Дата]), type datetime},               {  "Конец"  , each List.Max([Дата]), type datetime}},              GroupKind.Local, (s,c)=> Number.From(c[Пользовательская] <> true)),          RemoveColumns = Table.SelectColumns( Group,{  "Объект"  ,   "Начало"  ,   "Конец"  }),          SortAgain = Table.Sort(RemoveColumns,{{  "Объект"  , Order.Ascending}, {  "Начало"  , Order.Ascending}})    in          SortAgain   
 

upd. Некорректно отрабатывает, если у последнего объекта одна дата и если эта дата уже попадает в какой-то другой объект( или несколько, но эти даты встречались ранее, т.к вижу, что пересечение дат возможно
Спасибо за помощь. :)
Чтобы решить проблему в случае пересечения периодов вроде достаточно сделать начальную сортировку по Объекту, а потом по Дате.

В понедельник проверю на реальных данных)
Изменено: Semen - 23.09.2022 16:40:11
 
Цитата
Semen написал:
достаточно сделать начальную сортировку по Объекту, а потом по Дате.
да, в этом и была проблема)
 
whateverlover,
Цитата
whateverlover написал:
AddIndex[Дата]{[Индекс]} - #duration(1,0,0,0) = AddIndex[Дата]{[Индекс]-1}
на больших объемах это будет считаться очень долго
мой вариант:
Код
let
    a = Table.Sort(Excel.CurrentWorkbook(){[Name="Данные"]}[Content], {{"Объект", Order.Ascending}, {"Дата", Order.Ascending}}),
    b = Table.FromColumns(Table.ToColumns(a) & {List.Skip(a[Дата], 1)}),
    c = Table.AddIndexColumn(b, "q"),
    d = Table.AddColumn(c, "w", each if Number.From([Column3]) - Number.From([Column2]) = 1  then null else [q]),
    e = Table.FillUp(d,{"w"}),
    f = Table.Group(e, {"w", "Column1"}, {{"q", each List.Min([Column2])}, {"e", each List.Max([Column2])}})[[Column1], [q], [e]]
in
    f

Semen, не понятно почему у вас 2 08.01.22 заканчивается 10.01.22, если в массиве такой даты нет
 
Цитата
Антон написал:
не понятно почему у вас 2 08.01.22 заканчивается 10.01.22, если в массиве такой даты нет
Антон, это я игрался с датами, смотрел не будет ли ошибок, в исходном файле такие даты есть)
Спасибо за вариант!
 

Доброго времени суток.
Как создать список дат в периоды между внесением изменения в данные магазина. От даты последнего изменения даты заполняются по сегодняшний день.

 
Александр Медянцев, здравствуйте, можно так:
Код
let
    fr = Excel.CurrentWorkbook(){[Name="Последняя_запись__2"]}[Content],
    a0 = Table.ColumnNames(fr),
    f = (x)=> if (x+#duration(1,0,0,0))<DateTime.FixedLocalNow() then {x+#duration(1,0,0,0)}&@f(x+#duration(2,0,0,0)) else {x}
in
    f(Record.Field(Table.Last(fr), a0{1}))
Страницы: 1
Наверх