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.
3 Réponses :
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')
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.
Vous pouvez le faire avec Cela suppose bien sûr que toutes les 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
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.
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
Pouvez-vous donner un exemple de série?
pd.to_datetime (pd.Series (['2019-12-29'])). dt.strftime ('% U')renvoie52pour 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