Pandas - возвращает последний / первый день месяца в пользовательском указателе даты и времени - PullRequest
0 голосов
/ 17 марта 2019

Я использую мульти-индексный столбец данных с пользовательскими датами (определенные праздники, дни недели ...).

DatetimeIndex(['1989-01-31', '1989-02-01', '1989-02-02', '1989-02-03',
           '1989-02-06', '1989-02-07', '1989-02-08', '1989-02-09',
           '1989-02-10', '1989-02-13',
           ...
           '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28',
           '2019-03-01', '2019-03-04', '2019-03-05', '2019-03-06',
           '2019-03-07', '2019-03-08'],
          dtype='datetime64[ns]', length=7585, freq=None)

Мне нужно нарезать его на первый или последний день месяца из индекса.Из-за праздников ... первый / последний день месяца индекса не будет совпадать с freq = 'BM'.Не нужно упоминать, что я не могу использовать resample (), ...

Вот пример:

import pandas as pd
import numpy as np
idx = pd.DatetimeIndex(['1989-01-31', '1989-02-01', '1989-02-02', '1989-02-03','1989-02-06', '1989-02-07', '1989-02-08', '1989-02-09','1989-02-10', '1989-02-13', '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28','2019-03-01', '2019-03-04', '2019-03-05', '2019-03-06','2019-03-07', '2019-03-08'], dtype='datetime64[ns]')

numbers = [0, 1, 2]
colors = [u'green', u'purple']
col = pd.MultiIndex.from_product([numbers, colors],names=['number', 'color'])

df = pd.DataFrame(np.random.rand(len(idx),len(col)),index =idx,columns=col)
number            0                 1                 2         
color         green   purple    green   purple    green   purple
2018-06-05  0.64943  0.64943  0.64943  0.64943  0.64943  0.64943
etc...

Ожидаемый результат:

2018-06-29  0.64943  0.64943  0.64943  0.64943  0.64943  0.64943

Как можноя делаю это, пожалуйста?

спасибо

1 Ответ

1 голос
/ 17 марта 2019

Вам нужно использовать Grouper в вашем DataFrame.Использование mcve в приведенном выше вопросе:

# Month End
df.groupby(pd.Grouper(freq='M')).last()

# Month Start
df.groupby(pd.Grouper(freq='MS')).first()

Примечание: Группировка таким образом группирует по месяцу DateTimeIndex, чьи минимальные и максимальные месячные группы являются календарными и необязательно в индексе.

Таким образом, мы можем перейти к собственной группировке, требующей внимания к месяцам, повторяющимся на протяжении многих лет.

grpr = df.groupby([df.index.year, df.index.month])
data = []
for g, gdf in grpr:
    data.append(gdf.loc[gdf.index.min()])
    data.append(gdf.loc[gdf.index.max()])

new_df = pd.DataFrame(data)
new_df
number             0                   1                   2          
color          green    purple     green    purple     green    purple
1989-01-31  0.246601  0.915123  0.105688  0.645864  0.845655  0.339800
1989-01-31  0.246601  0.915123  0.105688  0.645864  0.845655  0.339800
1989-02-01  0.694509  0.665852  0.593890  0.715831  0.474022  0.011742
1989-02-13  0.770202  0.452575  0.935573  0.554261  0.235477  0.475279
2019-02-25  0.626251  0.826958  0.617132  0.118507  0.079782  0.183616
2019-02-28  0.740565  0.131821  0.968403  0.981093  0.211755  0.806868
2019-03-01  0.812805  0.379727  0.758403  0.345361  0.908825  0.166638
2019-03-08  0.238481  0.045592  0.740523  0.201989  0.432714  0.672510

Правильно видеть дублирование, потому что gdf.index.min() может равняться gdf.index.max().Проверка устранит дублирование при переборе групп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...