我有此数据:
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)
但这给我一个错误。
我猜想更手动的方法是每天创建一个新的数据行,然后是该数据的直方图?
答案 0 :(得分:2)
也许是这样:
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()
)
输出: