如果不是“月末”,如何在Pandas Dataframe中排除日期

时间:2019-03-07 09:57:31

标签: python pandas date dataframe

我有以下数据集:

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
您可能会看到

,所有日期均为“月末”,除了05-03-2019。我需要的是删除一个DATE值(如果它不是“月末”)。

我可怜的临时解决方案是

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

这不好,因为代码应该更通用。

我该怎么做?

3 个答案:

答案 0 :(得分:6)

这可以单线完成: 使用pandas.Series.dt.is_month_end

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

将为您提供结果。

答案 1 :(得分:4)

您可以使用pandas.tseries.offsets.MonthEnd来比较当前日期和月末日期,并对数据框执行布尔索引以仅保留那些满足条件的数据:

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

答案 2 :(得分:0)

我将其扩展为@Christian Sloper的答案。如果答案是自给自足的,我发现它更容易引用,并且我认为它将对他人有所帮助。

我创建了一个名为MonthEnd的新列,并使用了一个过滤器来仅获取那些不是月末的列。

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],
               })
#new column called MonthEnd 
df['MonthEnd'] =  pd.to_datetime(df['DATE']).dt.is_month_end
#filter to get only those that are not month end
df[~df["MonthEnd"]]

数据框:

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

过滤后:

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