代码之家  ›  专栏  ›  技术社区  ›  Amelio Vazquez-Reina

在Python中镜像日期

  •  2
  • Amelio Vazquez-Reina  · 技术社区  · 11 年前

    假设我们有一个连续运行的系统,并且我们在特定日期对其进行了一些更改 start_date .

    我们想比较以下变化的影响:

    • 的时间窗口 全天 之间 开始日期(_D) 以及今天的日期(以下黄色显示)
    • 这个 相等的 发生的全天时间窗口(一周中的同一天) 就在前面 开始日期(_D) (下图以蓝色显示)

    例如,假设我在 3月25日 (红色),今天是 3月29日 (绿色),我想获得 定义的日期 time_window_before (黄色的两个日期)和 time_window_after (蓝色的两个日期)。

    enter image description here

    我们的想法是比较 开始日期(_D) 前后 实验开始于 可能最长的 时间窗口上与实验开始日期对称的天数(以一周中的天数表示)。

    换句话说,给定 开始日期(_D) 以及今天的日期,我如何找到定义 时间窗口前 时间窗口之后 (作为 datetime 对象)?

    使现代化

    自从我被问到如果 开始日期(_D) 今天的日期不在同一周,下面是一个这样的例子:

    enter image description here

    3 回复  |  直到 5 年前
        1
  •  2
  •   Michal    11 年前

    Python的 datetime 库提供了添加和减去日期所需的所有方法:

    from datetime import date, timedelta
    
    def get_time_window_after(experiment_start_date, experiment_end_date):
      # Add 1 day to start and subtract 1 day from end
      print "After Start: %s" %(experiment_start_date + timedelta(days = 1))
      print "After End: %s" %(experiment_end_date - timedelta(days = 1))
    
    def get_time_window_before(experiment_start_date, experiment_end_date):
      # Find the total length of the experiment
      delta = experiment_end_date - experiment_start_date
      # Determine how many weeks it covers (add 1 because same week would be 0)
      delta_magnitude = 1 + (delta.days / 7)
    
      # Subtract 7 days per week that the experiment covered, also add/subtract 1 day
      print "Before Start: %s" %(experiment_start_date - timedelta(days = 7 * delta_magnitude) + timedelta(days = 1))
      print "Before End: %s" %(experiment_end_date - timedelta(days = 7 * delta_magnitude) - timedelta(days = 1))
    

    下面是我运行代码以确保其正常工作的示例:

    print "\nResults for March 25 2014 to March 29 2014"
    get_time_window_after(date(2014, 3, 25), date(2014, 3, 29))
    get_time_window_before(date(2014, 3, 25), date(2014, 3, 29))
    
    print "\nResults for March 18 2014 to March 29 2014"
    get_time_window_after(date(2014, 3, 18), date(2014, 3, 29))
    get_time_window_before(date(2014, 3, 18), date(2014, 3, 29))
    
    print "\nResults for March 18 2014 to April 04 2014"
    get_time_window_after(date(2014, 3, 18), date(2014, 4, 4))
    get_time_window_before(date(2014, 3, 18), date(2014, 4, 4))
    

    注意:如果使这些函数返回值并设置变量,则可以使用 time_window_after 作为输入 get_time_window_before() 功能并放弃复制 timedelta(days = 1) 思维方式

        2
  •  2
  •   Heikki Toivonen    11 年前

    这至少在您的两个示例中有效,这是否足够好?:

    experiment_start_date = datetime.date(2014,3,18)
    now=datetime.date(2014,3,29)
    
    day_after1 = experiment_start_date+datetime.timedelta(1)
    day_after2 = now-datetime.timedelta(1)
    day_before2 = experiment_start_date-datetime.timedelta(day_after2.weekday()-experiment_start_date.weekday()+1)
    day_before1 = day_before2-(day_after2-day_after1)
    
        3
  •  1
  •   Amelio Vazquez-Reina    10 年前

    应该由以下人员完成:

    def get_symmetric_time_window_fwd(ref_date, end_date):
      da1 = ref_date+timedelta(1)
      da2 = end_date-timedelta(1)
    
      if da2.weekday() >= ref_date.weekday():
        db2 = da2 - timedelta( 7 * (1+int((end_date - ref_date).days/7)))
      else:
        db2 = da2 - timedelta( 7 * (int((end_date - ref_date).days/7)))
    
      db1 = db2-(da2-da1)
    
      return da1, da2, db1, db2
    

    测试1:

    In: get_symmetric_time_window(date(2014, 3, 18), date(2014, 3, 29))
    Out: 
    (datetime.date(2014, 3, 19),
     datetime.date(2014, 3, 28),
     datetime.date(2014, 3, 5),
     datetime.date(2014, 3, 14))
    

    测试2:

    In: get_symmetric_time_window(date(2014, 3, 25), date(2014, 3, 29))
    Out: 
    (datetime.date(2014, 3, 26),
     datetime.date(2014, 3, 28),
     datetime.date(2014, 3, 19),
     datetime.date(2014, 3, 21))
    

    测试3:

    In: get_symmetric_time_window(date(2014, 7, 17), date(2014, 7, 23))
    Out: 
    (datetime.date(2014, 7, 18),
     datetime.date(2014, 7, 22),
     datetime.date(2014, 7, 11),
     datetime.date(2014, 7, 15))