как построить гистограмму в пандах с временной шкалой и временной меткой - PullRequest
0 голосов
/ 20 сентября 2019

Учитывая временную метку df с timedelta, показывающую покрытое время, например:

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 минут?Мне нужна гистограмма, которая будет показывать 0 или 1 на оси Y с 1 для каждого 15-минутного сегмента в охватываемых выше периодах времени и 0 для всех 15-минутных сегментов, не охватываемых.

В соответствии с этим ответом я пытался:

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

Тем не менее, это график каждого временного интервала по вертикали и не показывает, что отсутствует целый час 2019-09-19 20:00.

vertical_timegap_plot.

Я пытался

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

Он показывает следующее, что не очень полезно.

enter image description here

Я также попробовал этот ответ безрезультатно.

Обновление

На основе ответа lostCode Мне удалось дополнительно изменить 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'))

Есть ли лучший, более эффективный способ сделать это?

1 Ответ

2 голосов
/ 20 сентября 2019

Вы можете использовать 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))

enter image description here

...