我想通过使用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
我认为你的方法不可能,因为熊猫如何定义时间频率。我能得到的最接近的是:
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