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

Python 如何在非连续数据中计算每周、每月和季节性开始和结束日期,python,algorithm,date,python-3.x,calendar,Python,Algorithm,Date,Python 3.x,Calendar,我有一系列的日期可以追溯到几年前,但是,它们不是连续的,这意味着在一些星期有7个日期,在其他一些星期有3个日期,在一些极端情况下,那一周只有一个日期 我需要确定并标记每个星期的开始和结束日期,这些日期都是可用的。例如,2015-06-23、2015-06-24、2015-06-25、和2015-06-27记录的是从2015-06-22(周一)开始的一周,因此2015-06-23和2015-06-27应该分别是该周的开始和结束。如果给定的一周只记录了一个日期,则该日期应同时为该周的开始和结束日期

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

我需要确定并标记每个星期的开始和结束日期,这些日期都是可用的。例如,
2015-06-23
2015-06-24
2015-06-25
、和
2015-06-27
记录的是从
2015-06-22(周一)
开始的一周,因此
2015-06-23
2015-06-27
应该分别是该周的开始和结束。如果给定的一周只记录了一个日期,则该日期应同时为该周的开始和结束日期

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

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

什么是执行上述所有操作的高效算法?

它是的一个变体,其中要求您找到每个“不同”元素的两个特定实例。
(通过为
i
th元素添加
i/epsilon
时间,然后确定是否有一周的时间包含多个日期,可以减少元素的差异性)

元素差异性通常通过以下两种方法之一解决,也可在此处应用:

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

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

    感谢您的指导,它们非常有用。但我有一个问题:对于第一种方法(排序),在对日期进行排序(例如,降序)后,当您迭代这些日期时,假设您当前的日期是星期三,下一个日期是星期二,但是如何区分这是同一周的星期二还是前一周的星期二?如前所述,我的数据中可能缺少某一周中的某些天。@skyork星期三之后的星期二总是在下一周。如果您按降序排列日期,即从最晚到最早,则不一定如此,如我上面所建议的。同样,我的数据中的日期是不规则的,因此一周中的天数不是恒定的。如果按另一个方向排序,同样的问题仍然存在,例如,在没有获得额外信息(如两个日期之间的差异)的情况下,如何知道星期三之后的星期四在当前星期或之后的星期?