3
votes

Comment exclure une date dans Pandas Dataframe si ce n'est pas "fin de mois"

J'ai le jeu de données suivant:

df2=df[df.TODATE < '2019-03-01']

s que vous pourriez voir, toutes les dates sont "fin de mois", sauf pour le 05-03-2019. Ce dont j'ai besoin, c'est de supprimer une valeur DATE si ce n'est pas la «fin du mois».

Ma mauvaise solution tempérée est

import datetime
import pandas as pd

df = pd.DataFrame({'PORTFOLIO': ['A', 'A', 'A', 'A','A', 'A', 'A', 'A','A', 'A','A', 'A', 'A', 'A'],
               'DATE': ['28-02-2018','31-03-2018','30-04-2018','31-05-2018','30-06-2018','31-07-2018','31-08-2018',
                        '30-09-2018','31-10-2018','30-11-2018','31-12-2018','31-01-2019','28-02-2019','05-03-2019'],
               'IRR': [.7, .8, .9, .4, .2, .3, .4, .9, .7, .8, .9, .4,.7, .8],
               })
df

   PORTFOLIO       DATE  IRR
0          A 2018-02-28  0.7
1          A 2018-03-31  0.8
2          A 2018-04-30  0.9
3          A 2018-05-31  0.4
4          A 2018-06-30  0.2
5          A 2018-07-31  0.3
6          A 2018-08-31  0.4
7          A 2018-09-30  0.9
8          A 2018-10-31  0.7
9          A 2018-11-30  0.8
10         A 2018-12-31  0.9
11         A 2019-01-31  0.4
12         A 2019-02-28  0.7
13         A 2019-05-03  0.8

ce qui n'est pas bon car le code devrait être plus général.

Comment dois-je faire ça?


0 commentaires

3 Réponses :


4
votes

Vous pouvez utiliser pandas.tseries.offsets.MonthEnd afin de comparer les dates actuelles avec les dates de fin de mois, et effectuer une indexation booléenne sur le dataframe pour ne conserver que celles qui satisfont à la condition:

from pandas.tseries.offsets import MonthEnd
df.DATE = pd.to_datetime(df.DATE)

df[df.DATE == df.DATE + MonthEnd(0)]

    PORTFOLIO   DATE  IRR
0          A 2018-02-28  0.7
1          A 2018-03-31  0.8
2          A 2018-04-30  0.9
3          A 2018-05-31  0.4
4          A 2018-06-30  0.2
5          A 2018-07-31  0.3
6          A 2018-08-31  0.4
7          A 2018-09-30  0.9
8          A 2018-10-31  0.7
9          A 2018-11-30  0.8
10         A 2018-12-31  0.9
11         A 2019-01-31  0.4
12         A 2019-02-28  0.7


0 commentaires

8
votes

Cela peut être fait en une seule ligne: utilisez pandas.Series.dt.is_month_end

df[pd.to_datetime(df["DATE"]).dt.is_month_end]

vous donnera votre résultat.


0 commentaires

1
votes

Je mets ceci pour développer la réponse de @Christian Sloper. Je trouve qu'il est plus facile de faire référence, si la réponse est autonome et que je pense que cela aidera les autres.

J'ai créé une nouvelle colonne appelée MonthEnd et utilisé un filtre pour obtenir uniquement celles qui ne sont pas de fin de mois.

XXX

dataframe:

DATE    IRR PORTFOLIO   MonthEnd
13  05-03-2019  0.8 A   False

Après le filtre:

DATE    IRR PORTFOLIO   MonthEnd
0   28-02-2018  0.7 A   True
1   31-03-2018  0.8 A   True
2   30-04-2018  0.9 A   True
3   31-05-2018  0.4 A   True
4   30-06-2018  0.2 A   True
5   31-07-2018  0.3 A   True
6   31-08-2018  0.4 A   True
7   30-09-2018  0.9 A   True
8   31-10-2018  0.7 A   True
9   30-11-2018  0.8 A   True
10  31-12-2018  0.9 A   True
11  31-01-2019  0.4 A   True
12  28-02-2019  0.7 A   True
13  05-03-2019  0.8 A   False


0 commentaires