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

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

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

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

Когда я запускаю его, диаграмма выглядит так: Как это выглядит

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


person imtephi    schedule 04.09.2020    source источник
comment
Пожалуйста, покажите данные time_began и time_end   -  person Karthik    schedule 04.09.2020
comment
Сортировка данных по дате перед построением графика должна решить эту проблему.   -  person Nathan    schedule 04.09.2020
comment
Я добавил другие данные. Я попытался добавить df.sort_values(by=date_start) прямо перед построением графика, и я не думаю, что это имело значение.   -  person imtephi    schedule 04.09.2020


Ответы (1)


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

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

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

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

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

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

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

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 datetimes, чтобы вы могли удалить второй экземпляр этого.
  2. Вы перезаписали столбец activecalls другим методом создания. Определите, какой из них правильный, и удалите другой.
person Shep    schedule 04.09.2020