如何在非连续数据中计算出每周、每月和季节性的开始和结束日期



我有一系列以年为单位的日期,但它们不是连续的,这意味着在某些周有7个日期,在其他一些周有3个日期,而在某些极端情况下,该周只有一个日期。

我需要确定并标记有可用日期的每周的开始和结束日期。例如,2015-06-232015-06-242015-06-252015-06-27是从2015-06-22 (Mon)开始的一周的记录,因此2015-06-232015-06-27应该分别是该周的开始和结束。如果给定的一周只记录了一个日期,那么该日期应该同时是该周的开始和结束。

将相同的概念扩展到月份,我需要识别和标记任何给定月份记录的开始和结束日期,无论给定月份有多少日期。

同样,这也适用于四季的定义(就开始月和结束月而言)可以自定义的季节。也就是说,我可以将四季定义为:春天(三月-五月)、夏天(六月-八月)、秋天(九月-十一月)、冬天(十二月-二月),或者我可以将月份转换为使用一些不同的定义。事实上,我们可以完全抛弃传统的季节概念,只定义四个连续的时期,每个时期连续三个月。给定这样的定义,我需要确定每个给定时期/季节的开始和结束日期。

什么是一种时间有效的算法来完成上述所有操作?

这是元素差异性问题的一个变体,要求您找到每个"不同"元素的2个特定实例。
(可以通过为第i个元素添加i / epsilon时间,然后找出是否有一周有多个日期来减少元素的清晰度)。

元素的清晰度通常通过两种方法之一来解决,这也可以应用于这里:

  1. 对数据进行排序,然后进行迭代。在排序后的数据中,很容易找到每周/月/年/的第一次和最后一次出现
  2. 填充从周数(整数)映射到列表的哈希图,包括本周的所有日期。找到第一个(最早的)数据很容易,然后您可以将本周定义为"第1周",稍后,可以很容易地计算每个日期从"第1周以来的偏移量(以周为单位)。因此,首先找到这个"第1周"日期(单次迭代),然后-创建所需的映射(在第二次迭代中,每次插入平均为O(1)),最后-迭代映射,对于每个日期-输出与本周相关的列表中的最小和最大日期

请注意,如果您正在寻找可扩展的解决方案,第二种方法可以很容易地转换为map reduce。

最新更新