1
votes

Comment créer une nouvelle colonne qui donne le nombre de jours dans ce mois particulier dans le dataframe python?

J'ai un dataframe qui contient «année» et «mois» comme colonnes séparées. Supposons que cela ressemble à:

entrez la description de l'image ici

Comment puis-je créer une autre colonne avec le nombre de jours dans ce mois particulier?

J'ai essayé d'utiliser une boucle for et if qui ressemble à:

def n_days(Month):
  for index, M in enumerate(Month):
    if Month[index] == 1:
      Month[index] = 31
    if Month[index] == 3:
      Month[index] = 31
    if Month[index] == 5:
      Month[index] = 31
    if Month[index] == 7:
      Month[index] = 31
    if Month[index] == 8:
      Month[index] = 31
    if Month[index] == 10:
      Month[index] = 31
    if Month[index] == 12:
      Month[index] = 31
    if Month[index] == 4:
      Month[index] = 30
    if Month[index] == 6:
      Month[index] = 30
    if Month[index] == 9:
      Month[index] = 30
    if Month[index] == 11:
      Month[index] = 30
    if Month[index] == 2:
      Month[index] = 28
  return Month


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser le module calendrier :

import calendar
def n_days(Month):
    return calendar.mdays


4 commentaires

mais il ne m'a donné qu'une liste de nombre de jours de janvier à décembre, je pense. Dans ma boucle n_days (Month), le 'Month' représente une liste de mois à partir du dataframe. Donc en fait Month = list (df ['month'])


comment puis-je avoir une fonction qui donne une colonne de nombre de jours en fonction de la valeur du mois correspondant dans le dataframe


Voilà une bonne question. Mon code fait exactement ce que fait votre code, c'est-à-dire. renvoyez simplement un tableau du nombre de jours dans le mois correspondant. Si vous indiquez le numéro du mois (basé sur 1), return calendar.mdays [month_number - 1] vous y amènera ...


Merci, je vais essayer à nouveau



1
votes

Vous pouvez utiliser monthrange () du module de calendrier à l'intérieur de apply:

In [7]: df = pd.DataFrame({"year": [2017,2018,2019,2020,2021], "month": [2,2,2,2
   ...: ,2]})                                                                   

In [8]: df                                                                      
Out[8]: 
   year  month
0  2017      2
1  2018      2
2  2019      2
3  2020      2
4  2021      2

In [9]: df["days"] = df.apply(lambda row: monthrange(row["year"], row["month"])[
   ...: 1], axis=1)                                                             

In [10]: df                                                                     
Out[10]: 
   year  month  days
0  2017      2    28
1  2018      2    28
2  2019      2    28
3  2020      2    29
4  2021      2    28

In [11]:  

Et voici un exemple:

In [1]: import pandas as pd                                                     


In [2]:                                                                         

In [2]: df = pd.DataFrame({"year": [2018,2019], "month": [1,2]})                

In [3]: df                                                                      
Out[3]: 
   year  month
0  2018      1
1  2019      2

In [4]: from calendar import monthrange                                         

In [5]: df["days"] = df.apply(lambda row: monthrange(row["year"], row["month"])[
   ...: 1], axis=1)                                                             

In [6]: df                                                                      
Out[6]: 
   year  month  days
0  2018      1    31
1  2019      2    28

In [7]:  

Un autre exemple pour voir la gestion des années bissextiles:

from calendar import monthrange

df["days"] = df.apply(lambda row: monthrange(row["year"], row["month"])[1], axis=1)


1 commentaires

Merci OMG je pense que ça marche très bien !!! En fait, j'envisageais d'utiliser la plage de mois mais je ne savais pas comment le faire fonctionner sur un dataframe !! Merci beaucoup!



0
votes

essayez pandas.Series.dt.daysinmonth

Example:

df = pd.DataFrame({'year':[2019,2019,2019,2019],'month':[1,2,6,12]})
>>> df
   month  year
0      1  2019
1      2  2019
2      6  2019
3     12  2019

# create new column
df['daysinmonth'] = pd.to_datetime(df['year'].astype(str)  + \
                                   df['month'].astype(str), format='%Y%m').dt.daysinmonth

>>> df
   month  year  daysinmonth
0      1  2019           31
1      2  2019           28
2      6  2019           30
3     12  2019           31


0 commentaires