Pandas/Python将月末行从数据帧拉入单独的数据帧
目前,我有一个时间序列数据框架,如下所示:Pandas/Python将月末行从数据帧拉入单独的数据帧,python,pandas,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.02324
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将被拉取,因为它最接近月底日期
任何提示都将不胜感激 您需要对日期进行排序,然后找到每个组的最后一个值
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
您需要对日期进行排序,然后找到每个组的最后一个值
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
根据月份编号分组并查找最后一条记录:
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\u value
:
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()
根据月份编号分组并查找最后一条记录:
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\u value
:
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()
这非常有效,但我目前面临的一个问题是,它停在指数12上,没有更多变化(日期范围为2016-2018年,但反向变化,仅2017-2018年)。有什么想法吗?@lee.edward01添加了编辑,应该也适用于跨越多年的任何案例。这很有效,但我目前面临的一个问题是它停在指数12上,没有更多(日期范围是2016-2018年,但相反,只有2017-2018年)。有什么想法吗?@lee.edward01添加了编辑,也适用于跨越多年的任何案例。