Панды: проблема с агрегацией по периодам в два месяца - PullRequest
0 голосов
/ 30 января 2019

Я хочу агрегировать данные по периодам в два месяца, используя групповой метод панд.И я не могу достичь ожидаемых результатов.Действительно, у меня есть данные за 4 месяца.Поэтому я хочу два периода: первый между 2018-06-01 и 2018-07-31 и второй период между 2018-08-01 и 2018-09-30.Ниже в коде вы найдете полученные и ожидаемые результаты.Не могли бы вы помочь мне об этом?Заранее спасибо !

# data sample
data={'A': pd.to_datetime(['2018-06-01','2018-06-15','2018-07-01','2018-07-15','2018-08-01','2018-08-15','2018-09-01','2018-09-15','2018-09-30']),
          'B': [1,1,1,1,1,1,1,1,1]}

#create dataframe
test=pd.DataFrame.from_dict(data)

#aggregation of data by period of two months
test.groupby(pd.Grouper(key='A', freq='2M',closed="right")).sum()

# The results

#              B
# A             
# 2018-06-30   2
# 2018-08-31   4
# 2018-10-31   3

#The expected results : 

#              B
# A             
# 2018-07-31  4
# 2018-09-30  5

1 Ответ

0 голосов
/ 30 января 2019

Я не думаю, что это возможно с вашим подходом, из-за того, как временные частоты определены в пандах.Самый близкий, который я мог получить, был:

In [22]: test.groupby(pd.Grouper(key='A', freq='2M', closed='left', base="2018-06-01")).sum()                                                                                      
Out[22]: 
            B
A            
2018-07-31  4
2018-09-30  4
2018-11-30  1

Не слишком элегантный способ получить ваши результаты мог бы быть:

In [30]: test['year'] = [x.year for x in test.A]                                                                                                                                   

In [31]: test['month'] = [x.month for x in test.A]                                                                                                                                 

In [58]: bimestres = np.repeat(np.arange(1,13,2),2)                                                                                                                                

In [59]: test['bimestre'] = [bimestres[x] for x in test.month]                                                                                                                     

In [60]: test.groupby(by=['year', 'bimestre'])['B'].sum()                                                                                                                          
Out[60]: 
year  bimestre
2018  7           4
      9           5
Name: B, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...