Страницы: 1
RSS
Подсчет заданного кол-ва рабочих дней от даты в Power Query
 
Приветствую, друзья, помогите посчитать в PQ  вот какую вещь:
Есть дата размещения заявки, срок исполнения 3 рабочих дня. То есть. если дата выполнения попадает на выходные или праздники то она должна переноситься на первый рабочий день следующий за ними.
Как это можно реализовать?

Файл прикрепил (перечень праздничных дней внутри)
Изменено: Dyroff - 11.02.2019 15:01:34
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Добрый день! Может найдете информацию в следующем запросе: Данные-Получить данные-Из других источников-Пустой запрос- в строке формул вводим "=List.Dates"
 
kristina S, Это было б легко, как прописать "вхождение выходных" - вот вопрос.
Сижу жду от гуру вариант решения - интересно))
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
kristina S, ' эта функция генерирует список дат определенной длинны от начальной
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Примерно так. Оно на коленке, можно реализовать и как функцию, но сейчас времени нет.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    ИзмененныйТип = Table.TransformColumnTypes(Источник,{{"дата размещения", type date}, {"дата выполнения", type text}}),
    ДругиеУдаленныеСтолбцы = Table.SelectColumns(ИзмененныйТип,{"дата размещения"}),
    ДобСписокДат = Table.AddColumn(ДругиеУдаленныеСтолбцы, "Список", each List.Dates( Date.AddDays([дата размещения],1), Number.From( List.Max(ДругиеУдаленныеСтолбцы[дата размещения]) - List.Min(ДругиеУдаленныеСтолбцы[дата размещения]) ) + 100, #duration(1, 0, 0, 0) ), type list),
    СписокТолькоРабДней = Table.TransformColumns(ДобСписокДат, {{"Список", each List.Difference( List.Select(_, (x) => Date.DayOfWeek(x) <> 5 and Date.DayOfWeek(x) <> 6), Праздники){0}, type date}})
in
    СписокТолькоРабДней

И еще, список рабочих дней лучше формировать с официального сайта с производственным календарем, т.к. ваша логика не учитывает рабочих дней, которые перенесены на выходные, как было с субботой 29.12.2018. Как скачивать такой календарь я давал здесь.
Вот горшок пустой, он предмет простой...
 
PooHkrd, Спасибо большое за решение. Да, я видел запись по ссылке, и тут действительно я не учитывал перенесенных дней.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, если брать даты из календаря, то нужно просто формировать из него список рабочих дней, а дальше через List.Select формируете список дат, которые больше чем та, которая нужна, а от получившегося списка забираете первый его элемент либо через прямую ссылку {0}, либо через List.First().
Вот горшок пустой, он предмет простой...
 
PooHkrd, Спасибо, попробую реализовать.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
PooHkrd написал:
от получившегося списка забираете первый его элемент либо через прямую ссылку {0}, либо через List.First().
очень актуальная для меня  тема.
Как быть если во вновь образованном списке рабочих дней, начинающихся с определенной даты нужно выбрать не первый а заданный числом в отдельном столбце таблицы (см. пример)
Изменено: Vitalee - 18.02.2021 10:58:52
 
Цитата
Vitalee написал:
заданный числом в отдельном столбце таблицы
Список дат формируется по той же схеме что я приводил выше, а дальше, чтобы выхватить из этого списка нужный элемент по индексу, например 20й, то пишем так list{19),, или list{20-1}, если так понятнее, т.к. нумерация элементов списка начинается с нуля.
Вот горшок пустой, он предмет простой...
 
PooHkrd, я бы хотел понять как во второй параметр функции Table.TransformColumns (table, transformOperations, ...)
передать значение из самой таблицы table, чью колонку данная функция преобразует

В итоге функция Table.TransformColumns для каждой записи таблицы table развернула бы свой элемент из списка дат
Изменено: Vitalee - 18.02.2021 16:18:43
 
Цитата
Vitalee написал:
как во второй параметр функции Table.TransformColumns (
Никак, для этого существует Table.ReplaceValue, вот с ним такое можно.
Так нужно?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    ИзмененныйТип = Table.TransformColumnTypes(Источник,{{"дата размещения", type date}, {"дата выполнения", type text}}),
    ДобСписокДат = Table.AddColumn(ИзмененныйТип, "Список", each List.Dates( Date.AddDays([дата размещения],1), Number.From( List.Max(ИзмененныйТип[дата размещения]) - List.Min(ИзмененныйТип[дата размещения]) ) + 100, #duration(1, 0, 0, 0) ), type list),
    СписокТолькоРабДней = Table.ReplaceValue(ДобСписокДат,each [#"срок оплаты (рабочих дней)"],0,(a,b,c)=>List.Difference( List.Select(a, (x) => Date.DayOfWeek(x) < 5), Праздники){b-1} ,{"Список"})
in
    СписокТолькоРабДней
Вот горшок пустой, он предмет простой...
 
Спасибо, PooHkrd, да, это то что нужно. Очень выручили.
перечитал 3 раза описание Table.ReplaceValue на MicrosoftDocs и так и не понял: как она сработала в данном случае.
больше всего вопросов вызвала интерпретация четвертого аргумента  (replacer function)
Код
(a,b,c)=>List.Difference( List.Select(a,(x)=> Date.DayOfWeek(x)>5),Праздники){b-1},
 
Vitalee, вся суть table.replacevalue в одной картинке
Вот горшок пустой, он предмет простой...
 
Шаманство, прям какое-то: без танцев с бубнами до истины не докопаться.
Еще раз огромное спасибо!
Остался маленький момент - на портале открытых данных с 2019 года не обновлялись справочники производственных календарей. может кто-то подскажет другой ресурс?
 
Vitalee, собственно рекомендую следить за приемами от автора сайта, там кладезь мудроты, в том числе и по вашему вопросу.
Вот горшок пустой, он предмет простой...
 
Добрый день. Строго не судите, начинающий пользователь PQ. Прошу помощи, как это реализовать. Пример во вложении. Есть столбец с начальной датой, есть столбец со списком только рабочих дней. Как получить столбец с датами например через 35 дней?
 
Цитата
Денис Федотов написал:
Есть столбец с начальной датой, есть столбец со списком только рабочих дней
Где это все в примере?
Вот горшок пустой, он предмет простой...
 
Сделал скрин. Есть столбец с датами к каждой дате список  с рабочими днями в соседнем столбце.
Далее в моем понимании для получения списка от даты больше, чем моя начальная,как то так :
Код
List.Select([Рабочие дни], each _ >[Дата])

Но эта функция так не работает
 
Цитата
Денис Федотов написал:  Как получить столбец с датами например через 35 дней?
Читаем название темы:
Цитата
Dyroff написал: Подсчет заданного кол-ва рабочих дней
Вывод?
 
Если это намек на то, что мой вопрос к теме не относится, то не соглашусь.
Цитата
написал:
Приветствую, друзья, помогите посчитать в PQ  вот какую вещь:Есть дата размещения заявки, срок исполнения 3 рабочих дня. То есть. если дата выполнения попадает на выходные или праздники то она должна переноситься на первый рабочий день следующий за ними.Как это можно реализовать?

У меня именно такая же проблема
 
Согласен.
 
Добрый день!
Прошу помочь с задачей, требуется подсчитать количество выходных дней между двумя датами. Застрял на использовании условий сравнения в List.Select. Пишет что "Не удаётся применить оператор < к типам List и Date".
 
Андрей Васильевич,
Код
= Table.AddColumn(#"Измененный тип", "Пользовательская", each List.Count(List.Select(ВыходДни, (x) => x >= [Актуальный срок] and x <= [Дата факт])), type number)
Изменено: te1n - 20.12.2022 00:00:28
 
te1n, спасибо, выручили!  
Страницы: 1
Наверх