import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
task_count = 3
total_duration = 12
tasks = np.random.dirichlet(np.ones(task_count), size=12)
task_names = [f"Task {chr(97 + n).title()}" for n in range(task_count)]
task_times = []
s = datetime.combine(datetime.today(), datetime.min.time())
for task in tasks:
for x in range(len(task)):
t, n = task[x], task_names[x]
e = s + timedelta(hours=t)
task_times.append((n, s, e, t))
s = e
df = pd.DataFrame(task_times, columns=['Task', 'Start', 'End', 'Duration'])
df.sample(5)
Task | Start | End | Duration | |
---|---|---|---|---|
19 | Task B | 2021-11-13 06:09:48.623472 | 2021-11-13 06:56:03.126204 | 0.770695 |
9 | Task A | 2021-11-13 03:00:00.000001 | 2021-11-13 03:01:10.405150 | 0.019557 |
34 | Task B | 2021-11-13 11:29:19.492632 | 2021-11-13 11:56:51.652408 | 0.458933 |
14 | Task C | 2021-11-13 04:44:50.015073 | 2021-11-13 05:00:00.000001 | 0.252774 |
13 | Task B | 2021-11-13 04:22:15.480549 | 2021-11-13 04:44:50.015073 | 0.376260 |
fig = px.timeline(df, x_start='Start', x_end='End', y='Task', color='Task')
fig.show()
df = pd.DataFrame(task_times, columns=['Task', 'Start', 'End', 'Duration'])
df['Hour'] = df['Start'].apply(lambda x: x.round(freq='H').strftime("%T"))
data = []
bar_width = 1.0 / task_count
for task, rows in df.groupby('Task'):
width = 1.0 - sum([bar_width for _ in range(task_names.index(task))])
data.append(go.Bar(
x=rows['Hour'], y=rows['Duration'],
width=width, name=task
))
fig = go.Figure(data=data, layout={"barmode": "overlay"})
fig.show()