使用ISO周频率获取2020年的所有开始日期

问题描述

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

类似的东西:

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

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

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

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

from datetime import date,timedelta

START_DATE = date(2020,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

解决方法

如果您可以使用熊猫,也许这样的事情应该可行-

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)
,

对于第一个时间间隔,请找到开始日期的工作日,并将其从整周中减去。 第一步之后,将时间间隔设置回一周。

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)
,

试图回答自己。

我不知道这是否是最好的解决方案,但是对于我的目标来说似乎很好用

from datetime import date,timedelta

START_DATE = date(2020,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