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
3 Réponses :
Vous pouvez utiliser le module calendrier :
import calendar
def n_days(Month):
return calendar.mdays
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
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)
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!
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