2017-08-17 21 views
0

我想转换一个yyyyww,它实际上是一个字符串对象,我认为它就像201731一样。我想捕获包括它自己在内的最后6周。返回ISO周列表,它使用python跨越另一年

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它返回:

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

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

任何想法如何适应此?

回答

0

这需要安装“isoweek”软件包,但给了我一些我想要的操作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") 
0

我对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[201700, 201652, 201651, 201650, 201649, 201648]

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

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

+0

感谢解决方法M.Hamel,但需要一个更清晰可靠的方法。我认为我发现了另一个黑客,但需要isoweek软件包。 – IcemanBerlin