Mathematica,比较日期的有效方法

时间:2012-03-21 08:22:52

标签: wolfram-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]

但它比寻找完全匹配要慢很多,有没有更快的方法呢?非常感谢你!

4 个答案:

答案 0 :(得分:5)

DateDifference确实很慢。这可以通过将所有日期转换为“绝对时间”来解决,在Mathematica中表示自1900年1月1日以来经过的秒数。

这是一个例子。这是数据:

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

我们正在寻找这个日期或下一个日期,如果没有:

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

检索它的一种方法是:

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

您将找到其他方法,包括已经实现的二进制搜索in the answers to this question

答案 1 :(得分:4)

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 :(得分:2)

假设您的历史记录是有序的,您可以/更快地编写二进制搜索吗?

这应该给你log(n)比较中的日期,这比你现在使用的线性过滤器更好。 如果它会给你日期,如果它存在,或者日期不存在,它会给你一个你应该插入新日期的点。

答案 3 :(得分:1)

许多访问同一数据集的最快的事情是根据日期和值的AbsoluteTime []创建插值函数。如果默认摆动方式错误,你可以否定所有的“秒”,它会以这种方式摆动。