Страницы: 1
RSS
PQ Создание непрерывного календаря дат
 
Приветствую, друзья. Прошу помощи в оптимизации создания календаря. Коротко суть:
Требуется создать непрерывный календарь дат с первой и до последней даты из списка.
Сейчас делаю это так:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Type = Table.TransformColumnTypes(Source,{{"дата", type date}}), // изменяем тип столбца с датами

      Form= List.Dates(
                 List.Min(Type[дата]),
                     Number.From(List.Max(Type[дата]))-
                     Number.From(List.Min(Type[дата]))+1,
                     #duration(1, 0, 0, 0)),                           //Формируем непрерывный список дат начиная с минимальной  с количеством дней равным разнице между максимальной и минимальной даты с добавлением 1 дня чтобы учесть последнее число
            Table = Table.FromList(Form, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
                Rename = Table.RenameColumns(Table,{{"Column1", "Дата"}}),
                    TypeDate = Table.TransformColumnTypes(Rename,{{"Дата", type date}}),
                        Год = Table.AddColumn(TypeDate, "Год", each Date.Year([Дата]), Int64.Type),
                            НомерМесяца = Table.AddColumn(Год, "Месяц", each Date.Month([Дата]), Int64.Type),
                        Месяц = Table.AddColumn(НомерМесяца, "Название месяца", each Date.MonthName([Дата]), type text),
                    Квартал = Table.AddColumn(Месяц, "Квартал", each Date.QuarterOfYear([Дата]), Int64.Type),
                Неделя = Table.AddColumn(Квартал, "Неделя года", each Date.WeekOfYear([Дата]), Int64.Type),
           ДеньНедели = Table.AddColumn(Неделя, "Название дня", each Date.DayOfWeekName([Дата]), type text),
    #"Добавлен пользовательский объект" = Table.AddColumn(ДеньНедели, "Рабочий/Выходной", each if[Название дня]="суббота"or[Название дня]="воскресенье"  then "Выходной" else "Рабочий")
in
#"Добавлен пользовательский объект"


Но на больших объемах очень тормозит. Буду благодарен, если поможете оптимизировать код с целью повышения быстродействия
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Здравствуйте
Цитата
Dyroff написал:
на больших объемах очень тормозит
На сто лет календарь появился за пять сек
Нужно ли оптимизировать? По моему, и так все хорошо
 
Цитата
Dyroff написал:
Но на больших объемах очень тормозит.
Под объемами подразумевается большое количество файлов в папке из которых вы выковыриваете мин/макс дату для календаря? Если так, то в этом деле самое главное просто знать заранее в каких файлах папки точно может быть как минимальная так и максимальна даты, и ограничить запрос поиском только в этих двух.
Еще возможно может помочь обернуть List.Dates в List.Buffer, а потом уже прикручивать к нему остальные столбцы.
З.Ы. и еще рекомендую ознакомиться с таким вот вариантом от Максима Уварова
З.Ы.Ы. Если я не путаю, то вы тут как то постили темку чтобы при даблклике на области значений в сводной запускался макрос, который зачищает мусор из заголовков сформировавшейся таблицы. Не напомните ссылочку?
Изменено: PooHkrd - 03.05.2020 09:55:07
Вот горшок пустой, он предмет простой...
 
Михаил Л,  У меня проблема в том, что самих файлов много. В рамках одного файла работает быстро. На большом кол-ве файлов минут 7 обновляет..


PooHkrd, Да, все верно, именно большое кол-во файлов. Система такова, что каждый файл, это отчет за каждый день. В итоге есть 7 папок в которых по 260 файлов. Я сначала их консолидирую, а потом уже из консолидированного объема ищу даты.

Варианты с ListBuffer  попробую, ссылку тоже посмотрю. Спасибо за информацию.

P.S.
По поводу вопроса про сводную - немного не такая задача была в моей теме. у меня было так: При дабл клике на листе сводной появляется новый лист с таблицей и мне нужно было при переходе с этого листа на другой удалить этот образовавшийся лист. Вот ссылка

В теме размещу вариант для случая, когда необходимо при  формировании листа очистить подпись в ячейке а1
Изменено: Dyroff - 03.05.2020 13:45:12
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Dyroff написал:
каждый файл, это отчет за каждый день. В итоге есть 7 папок в которых по 260 файлов. Я сначала их консолидирую, а потом уже из консолидированного объема ищу даты.
А в этих семи папках даты меняются? Если нет, то можно один раз вытащить даты в отдельную таблицу и далее обращаться только к этой таблице. Или вытащить даты за прошлые года, а за этот год отдельно тянуть из папки
 
Михаил Л, Да, там каждый день появляется новая дата.
Это показатели некие операционные показатели филиалов. Они сняли за сегодня- скинули в папку, и так каждый день.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
А не проще найти самую старую дату, а самую новую сделать например 2100 годом? И сформировать Календарь один раз?
 
Dyroff, Даты внутри файлов совпадают с датой создания файла? если да, то можно использовать
Код
Folder.Files(folder)[Date created]
Изменено: Андрей Лящук - 03.05.2020 20:33:46
 
DrillPipe, ну, может быть и проще)
Андрей Лящук, спасибо, попробую
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Такой вариант
Код
let
    DateStart = #date(1900,1,1),
    DateEnd = #date(2101,1,1),
    Culture = "en-US", // "ru-RU"
    Source = List.Generate(
        ()=> DateStart,
        (x)=>x< DateEnd,
        (x)=> Date.AddDays(x,1),
        (x)=>[
                Date = x,
                Year = Date.Year(x),
                Quarter = Date.QuarterOfYear(x),
                QuarterText = "Q'" & Text.From(Date.QuarterOfYear(x)),
                QuarterYearText = "Q" & Text.From(Date.QuarterOfYear(x)) & "' " & Text.From(Date.Year(x)),
                Month = Date.Month(x),
                MonthText = Text.Lower(Date.MonthName(x, Culture)),
                MonthTextShort = Text.Start(Text.Lower(Date.MonthName(x, Culture)), 3),
                MonthYearTextShort = Text.Start(Text.Lower(Date.MonthName(x, Culture)), 3) & "'" &Text.From(Date.Year(x)),
                Week = Date.WeekOfYear(x),
                DayOfWeek = Date.DayOfWeek(x, 0),
                WeekOfWeekName = Text.Lower( Date.DayOfWeekName(x, Culture) ),
                DayOff = if Date.DayOfWeek(x, 0) = 6 or Date.DayOfWeek(x, 0) = 0 then "Day off" else "Working day"

            ]
    ),
    Result = Table.FromRecords( Source,
                                type table[
                                            Date = Date.Type,
                                            Year = Number.Type, 
                                            Quarter = Number.Type,
                                            QuarterText = Text.Type,
                                            QuarterYearText = Text.Type,
                                            Month = Number.Type,
                                            MonthText = Text.Type,
                                            MonthTextShort = Text.Type,
                                            MonthYearTextShort = Text.Type,
                                            Week = Number.Type,
                                            DayOfWeek = Text.Type,
                                            WeekOfWeekName = Text.Type,
                                            DayOff = Text.Type
                                          ]    
                                )
in
    Result
Изменено: DrillPipe - 04.05.2020 19:01:14
 
DrillPipe, Спасибо. Поздно увидел Ваш последний ответ. Работает отлично.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Страницы: 1
Наверх