Return 使用 python 跨越另一年的 ISO 周列表

Return ISO Week list where it crosses over another year using python

我正在尝试转换一个 yyyyww,它实际上是一个字符串对象,我认为它类似于 201731。我想捕获过去 6 周的时间,包括它自己。

def generate_6_last_week(yearweek):
    weeks = [int(yearweek)]
    date = time.mktime(datetime.strptime(str(yearweek)+"0","%Y%W%w").timetuple())
    for i in range(1,6):
        date = date-604800 # 60*60*24*7
        weeks.append(int(datetime.fromtimestamp(int(date)).strftime('%Y%W')))
    return weeks

generate_6_last_week(201731)

所以 201731 的输出应该是:

 [201731, 201730, 201729, 201728, 201727, 201726]

这似乎可行,问题是如果我用像 201702 这样的交叉年份来测试它 returns 这个:

   [201702, 201701, 201700, 201651, 201650, 201649]

这看起来也不错,但我在 ISO 周内需要它,所以我认为不应该有 00 周,一年的最后一周应该是 53 或 52 而不是 51。

有什么想法可以调整吗?

我对striptime()一无所知。所以我通过编写自己的代码解决了这个问题。这是代码:

date=input()

a=int(date[0:4])
b=int(date[4:])

k=5-b

finallist=[]

def m(x,y):
    return(x-y)


if b>=5:
    date=int(date)
    finallist=[date,date-1,date-2,date-3,date-4,date-5]
    print(finallist)

else:
    date=int(date)
    for i in range(b+1):
        finallist.append(date)
        date-=1
    a-=1
    b=52
    date=int(str(a)+str(b))
    for i in range(k):
        finallist.append(date)
        date-=1
    print(finallist)

201700 gives [201700, 201652, 201651, 201650, 201649, 201648]

201702 gives [201702, 201701, 201700, 201652, 201651, 201650]

ALITER:有一种更简单的方法可以做到这一点。只需将 1 添加到列表中的那些特定列表项即可:p

这需要安装 "isoweek" 包,但通过对我的 str YYYYWW 格式进行一些操作,我得到了我想要的东西,并且在跨界年份中运行良好。

from isoweek import Week
yearweek = "201702"

weeks = [int(yearweek)]

x = 1
for i in range(5):
    week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))
    weeks.append(week)
    x +=1

print(weeks)

或函数格式。

def generate_6_last_week(yearweek):
    weeks = [int(yearweek)]
    x = 1
    for i in range(5):
        week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))

        weeks.append(week)
        x +=1

    print(weeks)

generate_6_last_week("201702")