【问题标题】:Mathematica, efficient way to compare datesMathematica,比较日期的有效方法
【发布时间】:2012-03-21 08:22:51
【问题描述】:

我有一个这样的列表:

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

我需要查找此列表以找到日期的精确匹配,如果没有匹配,我将在列表中找到下一个可用日期,这是我的代码:

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

但这比仅仅寻找完全匹配要慢得多,有没有更快的方法来做到这一点?非常感谢!

【问题讨论】:

  • 我不知道为什么这被否决了,这是个好问题!您也可以考虑在 Mathematica.SE 上提出与 Mathematica 相关的问题。您可能会更快地得到答案。

标签: wolfram-mathematica


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 天半秒)。

    【讨论】:

      【解决方案3】:

      假设你的历史是有序的,你会/会更快地编写二进制搜索吗?

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

      【讨论】:

      • 感谢 zebediah49 帮助新手而不是投票否决他!我检查了 BinarySearch,看起来很有希望,但我遇到了这个问题,我尝试了这个: BinarySearch[history, {2012, 3, 15}, #[[1]] &] 似乎 BinarySearch 不处理 {2012, 3, 15}作为一项,所以搜索失败,我该怎么办?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多