2017-08-17 4 views
0

Je suis en train de convertir un yyyyww qui commence réellement comme un objet chaîne je pense à est comme 201731. Je veux capturer les 6 dernières semaines, y compris son auto.Retour liste ISO Semaine où il traverse une autre année en utilisant 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) 

de sorte que la sortie pour 201731 devrait être:

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

et cela semble fonctionner, le problème est si je le tester avec une année de croisement comme 201702 retourne ceci:

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

Ce qui semble également très bon, mais j'en ai besoin dans les semaines ISO donc il ne devrait pas y avoir une semaine 00 je pense et la dernière semaine d'une année devrait être 53 ou 52 mais pas 51.

Des idées pour l'adapter?

Répondre

0

Cela nécessite l'installation du paquet "isoweek" mais m'a donné ce que je veux avec une manipulation du format de ma str YYYYWW et fonctionne bien avec les années de croisement .

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) 

ou dans un format de fonction.

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

Je ne sais rien à propos de striptime(). J'ai donc résolu le problème en écrivant mon propre code. Voici le code:

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

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

ALITER: Il y a une façon beaucoup plus facile de le faire. Ajoutez simplement 1 à ces éléments de liste spécifiques dans votre liste: p

+0

merci pour la solution de contournement M.Hamel mais ont besoin d'une manière plus claire et plus robuste. Je pense que j'ai trouvé un autre hack mais nécessite le paquet isoweek. – IcemanBerlin