我有一个这样的清单:
{{2002, 4, 10}, 9.61}, {{2002, 4, 11}, 9.53}, {{2002, 4, 12}, 9.58},
我需要查找此列表以找到日期的完全匹配,如果没有匹配,我将在列表中显示下一个可用日期,这是我的代码:
Select[history, DateDifference[#[[1]], {2012, 3, 17}] <= 0 &, 1]
但它比寻找完全匹配要慢很多,有没有更快的方法呢?非常感谢你!
答案 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 []创建插值函数。如果默认摆动方式错误,你可以否定所有的“秒”,它会以这种方式摆动。