Pandas / Python Вытягивание строк конца месяца из фрейма данных в отдельный фрейм данных - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время у меня есть фрейм данных временного ряда следующим образом:

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 голосов
/ 30 мая 2018

Сгруппируйте по номеру месяца и найдите последнюю запись:

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()
0 голосов
/ 30 мая 2018

Вам нужно отсортировать даты, а затем найти последнее значение для каждой группы.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...