1
votes

Comment continuer le numéro de la semaine lorsque l'année change en utilisant des pandas

Exemple: en utilisant

df['Week_Number'] = df['Date'].dt.strftime('%U') 
for 29/12/2019 the week is 52. and this week is from 29/12/2019 to 04/01/2020.

but for 01/01/2020 the week is getting as 00.

J'ai besoin de la semaine du 01/01/2020 également en 52. et du 05/01/2020 au 11/01/2020 en 53 . Cela doit être poursuivi.


5 commentaires

Pouvez-vous donner un exemple de série?


pd.to_datetime (pd.Series (['2019-12-29'])). dt.strftime ('% U') renvoie 52 pour moi et non < code> 53 . Il serait vraiment utile que vous fournissiez du code pour reproduire votre exemple.


Quoi qu'il en soit, vos hypothèses sont fausses. Le 29/12/2019 est en semaine 52 et le 01/01/2020 en semaine 1. Il n'y a pas de semaine 54 et pas de 53 en 2019 ... Que voulez-vous faire?


Avez-vous trouvé une solution pour la semaine 53 de 2019?


@ Jean-BaptisteYunès il y a la semaine 53 en 2019, dépend de la "convention" que vous utilisez .. 29,30,31 est la semaine 53 et la semaine 1 commence le 1er janvier


3 Réponses :


0
votes

Comme indiqué dans conversion d'une date pandas en numéro de semaine , vous pouvez utiliser df ['Date']. dt.week pour obtenir les numéros de semaine.

Pour que cela continue, vous pourriez peut-être résumer le numéro de la semaine dernière avec de nouvelles valeurs de semaine, quelque chose comme ceci ? Je ne peux pas tester ceci pour le moment ...

if(df['Date'].dt.strftime('%U') == 53):
  last = df['Date'].dt.strftime('%U')

df['Week_Number'] = last + df['Date'].dt.strftime('%U')


1 commentaires

Cela ne me donne que pour une année particulière, mais j'ai besoin que le numéro de semaine se poursuive même si l'année change.



0
votes

Vous pouvez le faire avec isoweek et isoyear . Je ne vois pas comment vous arrivez aux valeurs que vous présentez avec '% U' donc je suppose que vous voulez mapper la semaine commençant le dimanche 2019-12-29 code > se terminant le 2020-01-04 à 53 , et que vous souhaitez mapper la semaine suivante sur 54 et ainsi de suite. Pendant des semaines au-delà de l'année, vous avez besoin de isoweek .
isocalendar () fournit un tuple avec isoweek dans le deuxième élément et une isoyear unique correspondante dans le premier élément. Mais l'isoweek commence le lundi, nous devons donc ajouter un jour pour que le dimanche soit interprété comme lundi et compté pour la bonne semaine. 2019 est soustrait pour avoir des années à partir de 0, puis chaque année est multipliée par 53 et l'isoweek est ajouté. Enfin, il y a un décalage de 1 donc vous arrivez à 53.

In [0]: s=pd.Series(["29/12/2019", "01/01/2020", "05/01/2020", "11/01/2020"])                                    
        dts = pd.to_datetime(s,infer_datetime_format=True)                                                        
In [0]: (dts + pd.DateOffset(days=1)).apply(lambda x: (x.isocalendar()[0] -2019)*53 + x.isocalendar()[1] -1)                              
Out[0]: 
0    53
1    53
2    54
3    54
dtype: int64

Cela suppose bien sûr que toutes les années iso ont 53 semaines, ce qui n'est pas le cas, donc à la place vous voudriez calculer le nombre de semaines iso par an iso depuis 2019 et les additionner.


0 commentaires

0
votes

Vous cherchez peut-être ceci. J'ai fixé une époque. Si vous avez des dates antérieures à 2019, vous pouvez choisir une autre époque.

epoch= pd.Timestamp("2019-12-23")  

# Test data:
df=pd.DataFrame({"Date":pd.date_range("22/12/2019",freq="1D",periods=25)})   
df["Day_name"]=df.Date.dt.day_name()

# Calculation:
df["Week_Number"]=np.where(df.Date.astype("datetime64").le(epoch), \
                               df.Date.dt.week, \
                               df.Date.sub(epoch).dt.days//7+52)
    df                                                                                                                  

        Date   Day_name  Week_Number
0  2019-12-22     Sunday           51
1  2019-12-23     Monday           52
2  2019-12-24    Tuesday           52
3  2019-12-25  Wednesday           52
4  2019-12-26   Thursday           52
5  2019-12-27     Friday           52
6  2019-12-28   Saturday           52
7  2019-12-29     Sunday           52
8  2019-12-30     Monday           53
9  2019-12-31    Tuesday           53
10 2020-01-01  Wednesday           53
11 2020-01-02   Thursday           53
12 2020-01-03     Friday           53
13 2020-01-04   Saturday           53
14 2020-01-05     Sunday           53
15 2020-01-06     Monday           54
16 2020-01-07    Tuesday           54
17 2020-01-08  Wednesday           54
18 2020-01-09   Thursday           54
19 2020-01-10     Friday           54
20 2020-01-11   Saturday           54
21 2020-01-12     Sunday           54
22 2020-01-13     Monday           55
23 2020-01-14    Tuesday           55
24 2020-01-15  Wednesday           55


0 commentaires