То, что вы хотите избежать, это проверка всех значений в таблице данных. Поскольку данные являются последовательными, вы можете просто начать проверку со спины и остановиться, когда найдете правильный индекс.
Схематично:
tab = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
i = j = Length@tab;
While[tab[[i]] > 5, --i];
tab[[i ;; j]]
-> {5, 6, 7, 8, 9}
sustitute > 5
для того, что вы хотите проверить. У меня не было времени проверить это прямо сейчас, но в вашем случае, например,
maxDate=AbsoluteTime@plotDataAll[[-1,1]]; (* no need to find Max if data is sequential*)
i24h = iWeek = iMonth = iMax = Length@plotDataAll;
While[AbsoluteTime@plotDataAll[[i24h,1]] > maxDate-86400.,--i24h];
While[AbsoluteTime@plotDataAll[[iWeek,1]] > maxDate-604800.,--iWeek];
While[AbsoluteTime@plotDataAll[[iMonth,1]] > maxDate-2.592*^6.,--iMonth];
While[AbsoluteTime@plotDataAll[[i6Month,1]] > maxDate-1.5552*^7.,--i6Month];
Тогда, например,
DateListPlot@plotDataAll[[i24h;;iMax]]
Если вы хотите начать где-нибудь в середине plotDataAll
, просто используйте While
, чтобы сначала найти начальную точку, и установите iMax
и maxDate
соответственно.
Для больших наборов данных это может быть один из немногих случаев, когда конструкция цикла лучше встроенных функций MMA. Это, однако, может быть моим собственным невежеством, и если кто-то здесь знает о встроенной функции MMA, которая делает такого рода сравнение «останов, когда найдено совпадение» лучше, чем While
.
РЕДАКТИРОВАТЬ: Сравнение сроков
Я немного поиграл с Майком и моим решением и сравнил его с методом ОП. Вот код игрушки, который я использовал для каждого решения
tab = Range@1000000;
(* My solution *)
i = j = tab[[-1]];
While[tab[[i]] > j - 24, --i];
tab[[i ;; j]]
(* Mike's solution *)
tmp = tab[[-1]] - 24;
Pick[tab, Sign[tab[[All]] - tmp], 1]
(* Enedene's solution *)
j = tab[[-1]];
Select[tab, # > (j - 24) &]
Вот результаты (OS X, MMA 8.0.4, Core2Duo 2.0 ГГц)
Как вы можете видеть, решение Майка имеет определенное преимущество перед решением енедена, но, как я и предполагал изначально, недостатком использования встроенных функций, таких как Pick
, является то, что они по-прежнему выполняют сравнительную проверку всех элементов в списке, которые в этом случае крайне лишний. Мое решение имеет постоянное время из-за того, что ненужные проверки не выполняются.