Mathematica, эффективный способ сравнения дат - PullRequest
3 голосов
/ 21 марта 2012

У меня есть такой список:

{{2002, 4, 10}, 9.61}, {{2002, 4, 11}, 9.53}, {{2002, 4, 12}, 9.58},

Мне нужно просмотреть этот список, чтобы найти точное совпадение даты. Если совпадения нет, у меня будет следующая доступная дата в списке, вот мой код:

Select[history, DateDifference[#[[1]], {2012, 3, 17}] <= 0 &, 1]

но это намного медленнее, чем просто поиск точного соответствия, есть ли более быстрый способ сделать это? Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 21 марта 2012

Это правда, что DateDifference довольно медленно. Это можно обойти путем преобразования всех дат в «абсолютное время», которое в Mathematica означает количество секунд, прошедших с 1 января 1900 года.

Вот пример. Это данные:

data = {AbsoluteTime[#1], #2} & @@@ 
   FinancialData["GOOG", {{2010, 1, 1}, {2011, 1, 1}}];

Мы ищем эту или следующую дату, если она недоступна:

date = AbsoluteTime[{2010, 8, 1}]

Один из способов получить это:

dt[[1 + LengthWhile[dt[[All, 1]], # < date &]]]

В ответах на этот вопрос вы найдете другие методы, включая уже реализованный двоичный поиск, .

4 голосов
/ 21 марта 2012
finddate[data:{{{_Integer, _Integer, _Integer}, _}..}, 
   date:{_Integer, _Integer, _Integer}] := 
  First[Extract[data, (Position[#1, First[Nearest[#1, AbsoluteTime[date]]]] & )[
     AbsoluteTime/@ data[[All,1]]]]]

будет делать то, что вы хотите. Например.,

finddate[{{{2002, 4, 10}, 9.61}, {{2002, 4, 11}, 9.53}, {{2002, 4, 12}, 9.58}}, 
{2012, 3, 17}]

дает {{2002, 4, 12}, 9,58}

Это кажется достаточно быстрым (полсекунды для 10 ^ 5 дат).

2 голосов
/ 21 марта 2012

Не могли бы вы / было бы быстрее написать двоичный поиск, предполагая, что ваша история упорядочена?

Это должно дать вам дату в журнале (n) сравнений, что намного лучшелинейный фильтр, который вы используете сейчас.Если вам дадут дату, если она существует, или если дата не существует, она даст вам точку, где вы должны вставить новую дату.

1 голос
/ 22 марта 2012

Самым быстрым для многих обращений к одному и тому же набору данных является создание функции интерполяции на основе AbsoluteTime [] даты и значения. Если значение по умолчанию меняется неверно, вы можете отменить все «секунды», и оно будет изменено таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...