Wolfram mathematica Mathematica,比较日期的有效方法

Wolfram mathematica Mathematica,比较日期的有效方法,wolfram-mathematica,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] Select[history,DateDifference[#[[1]],{2012,3

我有这样一份清单:

{{2002, 4, 10}, 9.61}, {{2002, 4, 11}, 9.53}, {{2002, 4, 12}, 9.58},
我需要查找此列表以查找日期的精确匹配项,如果没有匹配项,我将在列表中找到下一个可用日期,以下是我的代码:

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

Select[history,DateDifference[#[[1]],{2012,3,17}]假设您的历史是有序的,您/您编写二进制搜索会更快吗

这将为您提供日志(n)比较中的日期,这比您现在使用的线性过滤器要好得多。 If将为您提供日期,如果该日期存在,或者如果该日期不存在,它将为您提供插入新日期的点

finddate[data:{{{_Integer, _Integer, _Integer}, _}..}, 
   date:{_Integer, _Integer, _Integer}] := 
  First[Extract[data, (Position[#1, First[Nearest[#1, AbsoluteTime[date]]]] & )[
     AbsoluteTime/@ data[[All,1]]]]]
我会做你想做的。 例如:

给出{2002,4,12,9.58}


它似乎相当快(10^5个日期为半秒)。

确实,
日期差
相当慢。这可以通过将所有日期转换为“绝对时间”来解决,在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 &]]]
dt[[1+纵向[dt[[All,1]],#

您会发现其他方法,包括已经实现的二进制搜索。

对同一数据集的多次访问来说,最快的事情是根据日期和值的绝对时间[]创建插值函数。如果默认值以错误的方式摆动,您可以否定所有“秒”谢谢你zebediah49,你帮了一个新手的忙,而不是把他投了反对票!我检查了BinarySearch,它似乎很有希望,但我遇到了这个问题,我尝试了这个:BinarySearch[history,{2012,3,15},{1]&]BinarySearch似乎没有治疗{2012,3,15}作为一个项目,所以搜索失败了,我该怎么办?我不知道为什么会被否决,这是一个很好的问题。你也可以考虑问Mathematica相关的问题。很可能你会更快地得到答案。
dt[[1 + LengthWhile[dt[[All, 1]], # < date &]]]