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?
3 Réponses :
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
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.
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