Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mathematica, efficient way to compare dates

I have a list like this:

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

I need to lookup this list to find the exact match of date, if there is no match, I'll have the next available date in the list, here is my code:

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

but it's a lot slower than just looking for exact match, is there a faster way to do this? Thank you very much!

like image 822
liups Avatar asked Oct 11 '25 17:10

liups


2 Answers

It is true that DateDifference is rather slow. This can be worked around by converting all dates to "absolute times", which in Mathematica means the number of seconds elapsed since 1900 January 1.

Here's an example. This is the data:

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

We're looking for this date or the next one if this is not available:

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

One way to retrieve it is:

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

You'll find other methods, including an already implemented binary search, in the answers to this question.

like image 69
Community Avatar answered Oct 16 '25 08:10

Community


finddate[data:{{{_Integer, _Integer, _Integer}, _}..}, 
   date:{_Integer, _Integer, _Integer}] := 
  First[Extract[data, (Position[#1, First[Nearest[#1, AbsoluteTime[date]]]] & )[
     AbsoluteTime/@ data[[All,1]]]]]

will do what you want. E.g.,

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

gives {{2002, 4, 12}, 9.58}

It seems to be reasonably fast ( half a second for 10^5 dates ).


Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!