【问题标题】:Getting all starting dates of year 2020 with ISO week frequency使用 ISO 周频率获取 2020 年的所有开始日期
【发布时间】:2020-09-30 09:19:38
【问题描述】:

我想创建一个日期列表,每个日期代表 ISO 2020 年第 N 周的开始日期。

类似:

weeks2020 = [date(2020, 1, 1), date(2020, 1, 6), date(2020, 1, 13), ...]

我使用timedelta(weeks=1) 获得了类似的东西,并将其添加到我的START_DATE (date(2020, 1, 1)),但我获得的日期不正确。

我知道我可以简单地将我的 START_DATE 更改为 date(2019, 12, 30),但我想知道是否有更可靠的方法来推导出给定年份中存在的所有周开始日期。

为了清楚起见,这就是我现在正在做的事情:

from datetime import date, timedelta

START_DATE = date(2020, 1, 1)
INTERVAL = timedelta(weeks=1)
STEPS = 54

prev_date = START_DATE

for i in range(1, STEPS):
    print(prev_date.strftime('%Y-%m-%d')) # step 1: 2020-01-01, step 2: 2020-01-08, ...
    prev_date += INTERVAL

【问题讨论】:

    标签: python python-3.x datetime calendar week-number


    【解决方案1】:

    对于第一个间隔,找到开始日期的星期几,然后从整周中减去它。 在第一步之后,将间隔设置回一周。

    START_DATE = date(2020, 1, 1)
    INTERVAL = timedelta(weeks=1) - timedelta(days=START_DATE.weekday())
    
    cur_date = START_DATE
    
    while cur_date.year == START_DATE.year:
        print(cur_date.strftime("%Y-%m-%d"))
        cur_date += INTERVAL
        INTERVAL = timedelta(weeks=1)
    

    【讨论】:

      【解决方案2】:

      如果你可以使用 pandas,也许这样的事情应该是可行的-

      import pandas as pd
      
      di = pd.to_datetime(pd.date_range(start='2020-1-1', end='2020-12-31', freq='D'))
      # check for either monday or start of the month
      weekstart = di[(di.weekday == 0) | ((di.day == 1) & (di.weekday != 6)]
      
      输出
      DatetimeIndex(['2020-01-01', '2020-01-06', '2020-01-13', '2020-01-20',
                     '2020-01-27', '2020-02-01', '2020-02-03', '2020-02-10',
                     '2020-02-17', '2020-02-24', '2020-03-02', '2020-03-09',
                     '2020-03-16', '2020-03-23', '2020-03-30', '2020-04-01',
                     '2020-04-06', '2020-04-13', '2020-04-20', '2020-04-27',
                     '2020-05-01', '2020-05-04', '2020-05-11', '2020-05-18',
                     '2020-05-25', '2020-06-01', '2020-06-08', '2020-06-15',
                     '2020-06-22', '2020-06-29', '2020-07-01', '2020-07-06',
                     '2020-07-13', '2020-07-20', '2020-07-27', '2020-08-01',
                     '2020-08-03', '2020-08-10', '2020-08-17', '2020-08-24',
                     '2020-08-31', '2020-09-01', '2020-09-07', '2020-09-14',
                     '2020-09-21', '2020-09-28', '2020-10-01', '2020-10-05',
                     '2020-10-12', '2020-10-19', '2020-10-26', '2020-11-02',
                     '2020-11-09', '2020-11-16', '2020-11-23', '2020-11-30',
                     '2020-12-01', '2020-12-07', '2020-12-14', '2020-12-21',
                     '2020-12-28'],
                    dtype='datetime64[ns]', freq=None)
      

      【讨论】:

      • 非常感谢您的帮助,但如果可能的话,我宁愿坚持使用标准库。但是,您的方法会奏效,所以 +1 ;)
      【解决方案3】:

      试着回答自己。

      我不知道这是否是最好的解决方案,但它似乎对我的目标很有效:

      from datetime import date, timedelta
      
      START_DATE = date(2020, 1, 1)
      INTERVAL = timedelta(days=1)
      STEPS = 366
      
      iso_week = 0
      
      weeks_2020 = []
      
      curr_date = START_DATE
      
      for d in range (STEPS):
          if not curr_date.isocalendar()[1] == iso_week:
              iso_week = curr_date.isocalendar()[1]
              weeks_2020.append(curr_date)
          curr_date += INTERVAL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 2015-01-11
        • 1970-01-01
        • 2022-12-11
        相关资源
        最近更新 更多