熊猫:给定开始和结束日期,制作日期直方图?

时间:2019-12-11 19:05:05

标签: pandas

我有此数据:

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)

但这给我一个错误。

我猜想更手动的方法是每天创建一个新的数据行,然后是该数据的直方图?

1 个答案:

答案 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()
)

输出:

enter image description here

或删除'date'中的unstack()以按日期获取计数:

enter image description here

或者如果您对每天的活动总数感兴趣:

(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()
)

输出:

enter image description here