2012-03-21 16 views
3

を比較する:Mathematicaの、効率的な方法は、私はこのようなリストを持っている日付を

私は一致しない場合、私は次があるでしょう、日付の正確な一致を見つけるために、このリストを検索する必要が
{{2002, 4, 10}, 9.61}, {{2002, 4, 11}, 9.53}, {{2002, 4, 12}, 9.58}, 

ここでは、リストで利用可能な日付は、私のコードは次のとおりです。

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

それだけで正確な一致を探しているよりもずっと遅くなります、これを行うためのより高速な方法はありますか?どうもありがとうございました!

+1

なぜこれが落とされたのか分かりませんが、これは良い質問です! Mathematica関連の質問は、[Mathematica.SE](http://mathematica.stackexchange.com/)でも尋ねることができます。答えが早くなる可能性があります。 – Szabolcs

答えて

3
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}] 

は、(10^5日付では半秒)合理的に高速であると思われる{{2002、4、12}、9.58}

を与えます。

+0

ありがとう!それは動作し、それは本当に速いです! – liups

2

あなたの履歴が注文されていると仮定して、バイナリ検索を書く方が早いでしょうか?

これは、log(n)比較の日付を与えるはずです。これは、現在使用していると思われる線形フィルタよりも優れています。 あなたに日付が与えられている場合、存在する場合、または日付が存在しない場合は、新しい日付を挿入する必要があります。

+0

zebediah49ありがとうございました。 BinarySearch [history、{2012、3、15}、#[[1]]&] BinarySearchは{2012、 3、15}を1つの項目として検索が失敗するので、どうすればよいですか? – liups

5

DateDifferenceがかなり遅いのは事実です。これは、すべての日付を「絶対時刻」に変換することで回避できます。Mathematicaでは、1月1日1900年から経過した秒数を意味します。

例を示します。これはデータです:それを取得するための

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

一つの方法は次のとおりです:

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

これが利用できない場合

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

私たちは、この日付または次のを探していますすでに実装されているバイナリ検索のin the answers to this questionを含む他の方法があります。

1

同じデータセットへの多くのアクセスで最も速いのは、日付と値のAbsoluteTime []に​​基づいて補間関数を作成することです。デフォルトが間違って振れると、すべての「秒」を無効にすることができます。

関連する問題