Как сделать линейный график одной непрерывной линией

#python #matplotlib

#python #matplotlib

Вопрос:

Я пытаюсь визуализировать свои данные, однако, когда я рисую точки, линии, кажется, проходят повсюду.

Вот фрагмент этих данных

 Date    time_began  time_end    activecalls date_start  date_end
7/3/2020    14:08:47    14:09:30    2   7/3/2020 14:08  7/3/2020 14:09
7/3/2020    14:06:05    14:06:48    4   7/3/2020 14:06  7/3/2020 14:06
7/3/2020    15:11:36    15:12:19    6   7/3/2020 15:11  7/3/2020 15:12
7/3/2020    13:37:52    13:38:35    1   7/3/2020 13:37  7/3/2020 13:38
7/3/2020    14:19:31    14:20:14    3   7/3/2020 14:19  7/3/2020 14:20
7/3/2020    13:58:01    13:58:44    1   7/3/2020 13:58  7/3/2020 13:58
7/3/2020    16:56:32    16:57:15    3   7/3/2020 16:56  7/3/2020 16:57
7/3/2020    16:15:26    16:16:09    6   7/3/2020 16:15  7/3/2020 16:16
7/3/2020    14:35:16    14:35:59    3   7/3/2020 14:35  7/3/2020 14:35
7/3/2020    15:54:48    15:55:31    9   7/3/2020 15:54  7/3/2020 15:55
7/3/2020    16:01:39    16:02:22    3   7/3/2020 16:01  7/3/2020 16:02
7/3/2020    15:52:51    15:53:34    4   7/3/2020 15:52  7/3/2020 15:53
  

Когда я запускаю его, диаграмма выглядит следующим образом:
На что это похоже

Вот как я хочу, чтобы это выглядело: Как я хочу, чтобы это выглядело

Комментарии:

1. Пожалуйста, покажите данные «time_began» и «time_end»

2. Сортировка данных по дате перед построением графика должна решить эту проблему

3. Я добавил другие данные. Я попытался добавить df.sort_values(by=»date_start») прямо перед построением графика, и я не думаю, что это имело значение.

Ответ №1:

В коде, который вы использовали для построения данных, нет ничего плохого, просто сами данные не соответствуют вашим ожиданиям. Я сделал здесь некоторые предположения, но, основываясь на предыдущей работе, я думаю, что есть две вещи, которые вы хотите сделать, чтобы исправить это

Диапазон дат в данных

Вы перезаписали свой фрейм данных, чтобы ограничить ваши данные включением только информации от '7/1/2020 16:08' до '7/4/2020 15:10' здесь:

 mask = (df['date_start'] > day1) amp; (df['date_end'] <= day2)
df = df.loc[mask]
  

Я не уверен, что это сделано специально, чтобы проверить первые несколько дней, но ваш ожидаемый график соответствует 2009 году, поэтому я бы рекомендовал удалить эти строки.

Активные вызовы — Попробуйте использовать агрегацию для каждого дня

Глядя на цифры в вашем фрагменте данных и сравнивая с ожидаемым результатом, данные за период с 2002 по 2009 год довольно детализированы. Если вы хотите объединить сумму активных вызовов по дням, вы хотите включить groupby() с pd.Grouper(), чтобы указать частоту day:

 df.groupby(pd.Grouper(key='date_start', freq='D'))['activecalls'].sum()
  

Отсюда вы можете просто отобразить добавление данных .plot(), который по умолчанию будет отображать линейный график, поскольку индекс теперь является вашим полем даты (агрегированным по дням):

 df.groupby(pd.Grouper(key='date_start', freq='D'))['activecalls'].sum().plot()
  

Наконец, в вашем коде есть несколько несоответствий, которые было бы неплохо просмотреть и устранить:

  1. Вам не нужно дважды конвертировать date_start и date_end в даты и времени pd, чтобы вы могли удалить второй экземпляр этого.
  2. Вы перезаписали столбец activecalls другим методом создания. Определите, какой из них правильный, и удалите другой.