Pandas / Python将月末行从数据帧拉到单独的数据帧中

时间:2018-05-30 15:49:40

标签: python pandas

目前我有一个时间序列数据框如下:

dfMain =

          Date  Portfolio Value
0   2016-07-01     1.000000e+06
1   2016-07-08     1.025168e+06
2   2016-07-15     1.028053e+06
3   2016-07-22     1.024184e+06
4   2016-07-29     1.022491e+06
5   2016-08-05     1.023241e+06
6   2016-08-12     1.030325e+06
7   2016-08-19     1.032742e+06
8   2016-08-26     1.032567e+06
9   2016-09-02     1.028614e+06
10  2016-09-09     9.930876e+05
11  2016-09-16     9.956875e+05
12  2016-09-23     1.010174e+06
13  2016-09-30     1.010388e+06
14  2016-10-07     1.004989e+06
15  2016-10-14     9.924929e+05
16  2016-10-21     9.969708e+05
17  2016-10-28     9.816373e+05
18  2016-11-04     9.563689e+05
19  2016-11-11     9.869579e+05
20  2016-11-18     9.936929e+05
21  2016-11-25     1.009625e+06 

鉴于数据框可能不同(不能只从示例中提取特定行),从数据框中提取最接近月末日期的最佳方法是什么?例如,索引4将被拉,因为它最接近月末日期。

任何提示都将不胜感激!

2 个答案:

答案 0 :(得分:2)

分组月份编号并找到最后一条记录:

df.Date = pd.to_datetime(df.Date, errors='coerce')
df.groupby(df.Date.dt.month).last()

           Date  Portfolio Value
Date                            
7    2016-07-29        1022491.0
8    2016-08-26        1032567.0
9    2016-09-30        1010388.0
10   2016-10-28         981637.3
11   2016-11-25        1009625.0

如果行未按日期排序,请先调用sort_values

df.sort_values('Date').groupby(df.Date.dt.month).last()

           Date  Portfolio Value
Date                            
7    2016-07-29        1022491.0
8    2016-08-26        1032567.0
9    2016-09-30        1010388.0
10   2016-10-28         981637.3
11   2016-11-25        1009625.0

无论如何都应该有效。

如果您的日期跨越多年,最好在年月上进行分组:

df.sort_values('Date').groupby([df.Date.dt.year, df.Date.dt.month]).last()

答案 1 :(得分:1)

您需要对日期进行排序,然后找到每个组的最后一个值。

df['Date'] = pd.to_datetime(df['Date'])
grp = df.sort_values('Date').groupby(df['Date'].dt.month)
pd.DataFrame([grp.get_group(x).iloc[-1] for x in grp.groups])

输出:

        Date    Portfolio Value
4   2016-07-29  1022491.0
8   2016-08-26  1032567.0
13  2016-09-30  1010388.0
17  2016-10-28  981637.3
21  2016-11-25  1009625.0