我有此数据:
df = pd.DataFrame({'start_date': ['2019/12/01 01:00:00', '2019/12/05 01:00:00',
'2019/12/01 01:00:00', '2019/12/01 01:00:00'],
'end_date': ['2019/12/05 10:00:00', '2019/12/09 10:00:00',
'2019/12/11 10:00:00', '2019/12/09 01:00:00'],
'campaign_id' : [1,2,3,4]})
我想绘制从2019/12/01到2019/12/11每天活跃的广告系列数量。
我怎样才能做到这一点?就像直方图一样,但是按日期-但是每行有多个日期。
我已经将列转换为时间戳:
df.start_date = df.start_date.astype('datetime64[ns]')
df.end_date = df.start_date.astype('datetime64[ns]')
也许我需要一个新的专栏文章pd.date_range
,然后就可以对熊猫进行一些聪明的分组了……?
df["date_range"] = pd.date_range(df.start_date, df.end_date)
但这给了我一个错误。
我猜想更手动的方法是每天创建一个新的数据行,然后是直方图?
也许这样:
pd.concat([
pd.Series(x.campaign_id, index=pd.date_range(x.start_date, x.end_date, freq='D'))
for i, x in df.iterrows()
]).groupby(level=0).value_counts().unstack('date').plot.bar()
或这个:
df['start_date'] = pd.to_datetime(df['start_date']).dt.normalize()
df['end_date'] = pd.to_datetime(df['end_date']).dt.normalize()
(df.assign(dummy=1)
.merge(pd.DataFrame({'dummy':1,
'date': pd.date_range('2019-12-01', '2019-12-11', freq='D')}),
on='dummy'
)
.query('start_date<=date<=end_date')
.groupby('date')['campaign_id']
.value_counts()
.unstack('date')
.plot.bar()
)
输出:
或删除'date'
内部unstack()
以按日期获取计数:
或者,如果您对每日活动总数感兴趣:
(df.assign(dummy=1)
.merge(pd.DataFrame({'dummy':1,
'date': pd.date_range('2019-12-01', '2019-12-11', freq='D')}),
on='dummy'
)
.query('start_date<=date<=end_date')
.groupby('date')['campaign_id']
.count()
.plot.bar()
)
输出:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句