熊猫:两个月的聚合问题

问题描述 投票:1回答:1

我想通过使用pandas的groupby方法按两个月的时间段汇总数据。而且我无法达到预期的结果。事实上,我有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
python pandas-groupby
1个回答
0
投票

我认为你的方法不可能,因为熊猫如何定义时间频率。我能得到的最接近的是:

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
© www.soinside.com 2019 - 2024. All rights reserved.