我有以下数据集:
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']
这不好,因为代码应该更通用。
我该怎么做?
答案 0 :(得分:6)
答案 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