【问题标题】:how to plot bar gaps in pandas dataframe with timedelta and timestamp如何使用 timedelta 和时间戳在 pandas 数据框中绘制条形间隙
【发布时间】:2020-01-21 00:26:12
【问题描述】:

给定一个带有 timedelta 的带时间戳的 df,显示所涵盖的时间,例如:

df = pd.DataFrame(pd.to_timedelta(['00:45:00','01:00:00','00:30:00']).rename('span'), 
    index=pd.to_datetime(['2019-09-19 18:00','2019-09-19 19:00','2019-09-19 21:00']).rename('ts'))

#                         span
# ts                          
# 2019-09-19 18:00:00 00:45:00
# 2019-09-19 19:00:00 01:00:00
# 2019-09-19 21:00:00 00:30:00

如何绘制每 15 分钟显示一次退出的条形图?我想要的是一个条形图,它将在 Y 轴上显示 0 或 1,在上面涵盖的时间段内,每个 15 分钟段显示 1,而未涵盖的所有 15 分钟段显示 0。

我试过这个answer

df['span'].astype('timedelta64[m]').plot.bar()

但是,这会垂直绘制每个时间跨度,并且并未显示 2019-09-19 20:00 的整个小时缺失。

.

我试过了

df['span'].astype('timedelta64[m]').plot()

它绘制以下不是很有用的。

我也试过这个answer,但无济于事。

更新

基于 lostCode 的 answer,我能够进一步修改 DataFrame,如下所示:

def isvalid(period):
    for ndx, row in df.iterrows():
        if (period.start_time >= ndx) and (period.start_time < row.end):
            return 1
    return 0
df['end']= df.index + df.span
ds = pd.period_range(df.index.min(), df.end.max(), freq='15T')
df_valid = pd.DataFrame(ds.map(isvalid).rename('valid'), index=ds.rename('period'))

有没有更好、更有效的方法?

【问题讨论】:

    标签: pandas datetime matplotlib time-series timespan


    【解决方案1】:

    您可以使用DataFrame.resample 创建一个新的DataFrame 来验证时间空间的存在。检查使用DataFrame.isin

    import numpy as np
    check=df.resample('H')['span'].sum().reset_index()
    d=df.reset_index('ts').sort_values('ts')
    check['valid']=np.where(check['ts'].isin(d['ts']),1,0)
    check.set_index('ts')['valid'].plot(kind='bar',figsize=(10,10))
    

    【讨论】:

    • 谢谢。是的,每小时有效。我们如何添加它以每 15 分钟或每分钟重新采样一次以显示从 18:45:00 到 19:00:00 的 dropout?