Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas/Python将月末行从数据帧拉入单独的数据帧_Python_Pandas - Fatal编程技术网

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添加了编辑,也适用于跨越多年的任何案例。