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

时间:2015-06-23 06:58:12

标签: python algorithm date python-3.x calendar

我有一系列的日期可以追溯到多年,然而,它们不是连续的,这意味着在某些星期有7个日期,在其他几周有3个日期,在某些极端情况下只有一个日期那个星期。

我需要识别并标记有可用日期的每周的开始和结束日期。例如,从2015-06-23开始记录2015-06-242015-06-252015-06-272015-06-22 (Mon)这一周,2015-06-23和{{1}应分别是该周的开始和结束。如果某一周只记录了一个日期,那么该日期应该同时是该周的开始和结束。

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

同样,这同样适用于可以定制四季(就开始和结束月份而言)定义的季节。也就是说,我可以将四季定义为:春季(3月 - 5月),夏季(6月 - 8月),秋季(9月 - 11月),冬季(12月 - 2月),或者我可能会将月份改为使用一些不同的定义。事实上,我们可能完全抛弃传统的季节概念,并且每个连续三个月定义四个连续的时期。鉴于这样的定义,我需要确定每个特定时期/季节的开始和结束日期。

什么是实现上述所有目标的节省时间的算法?

1 个答案:

答案 0 :(得分:1)

它是Element Distinctness Problem的变体,您需要在其中找到每个" distinct"的两个特定实例。元件。
(可以通过为i / epsilon元素添加i时间来减少元素清晰度,然后找出是否有一个星期有多个日期。

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

  1. 对数据进行排序,然后迭代它。在排序数据中,很容易找到每周/每月/每年的第一次和最后一次出现/...
  2. 填充从周数(整数)映射到列表的哈希映射,包括本周的所有日期。查找第一个(最早的)数据很容易,然后您可以将本周定义为"第1周和第34周;之后,很容易计算每个日期的偏差(以周为单位)和#34 ;第1周和第34周所以,首先找到这个"第1周和第34周; date(单次迭代),然后 - 创建所需的地图(在第二次迭代中,每次插入平均为O(1)),最后 - 迭代地图并为每个日期 - 输出最小和最大日期与本周相关的清单。
  3. 请注意,如果您正在寻找可扩展的解决方案,第二种方法可以很容易地转换为map-reduce