Способ установки фрейма данных не так прост в использовании. Поскольку все имена объединены в составную строку, их необходимо разделить, чтобы их можно было использовать.
Метки времени можно преобразовать в pandas отметки времени, используя pd.to_datatime
.
Здесь способ отображения данных. Возможны многие другие подходы, такие как создание столбца для каждого человека с логическим значением, чтобы указать, включены ли они в столбец values
.
from matplotlib import pyplot as plt
import pandas as pd
from datetime import datetime
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
df = pd.DataFrame([['Ed, Taylor, Liv', '0:00:00', '0:00:15'],
['Ed, Liv, Peter', '0:00:15', '0:00:30'],
['Taylor, Liv, Peter', '0:00:30', '0:00:49'],
['Ed, Liv, Peter', '0:00:49', '0:01:02']],
columns=['values', 'start time', 'end time'])
df['start time'] = pd.to_datetime(df['start time'])
df['end time'] = pd.to_datetime(df['end time'])
persons_set = set(name.strip() for names in df['values'] for name in names.split(","))
persons = {p: i for i, p in enumerate(sorted(persons_set))}
print(persons)
for person in persons:
periods = []
for names, start, end in zip(df['values'], df['start time'], df['end time']):
if person in set(name.strip() for name in names.split(",")):
periods.append((start, end - start))
plt.broken_barh(periods, (persons[person] - 0.45, 0.9),
facecolors=plt.cm.plasma(persons[person] / len(persons)))
plt.yticks(range(len(persons)), persons)
plt.show()