Создайте линейный график с датой и временем на оси X и количеством записей на оси Y - PullRequest
0 голосов
/ 19 апреля 2020

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

Пока у меня есть скопировал два нужных столбца из исходного кадра данных в новый и изменил формат столбца datetime:

line_chart =frame[['index', 'Start Time and Date']].copy()
line_chart['Start Time and Date']=line_chart['Start Time and Date'].dt.to_period('M')

Далее я попытался использовать plotly для создания диаграммы:

import plotly.express as px
fig = px.line(line_chart, x='Start Time and Date', y='index')
fig.show()

Но я получаю эту ошибку: Object of type Period is not JSON serializable

Я также пробовал чертить с matplotlib:

x=line_chart['Start Time and Date']
y=line_chart['index']
plt.plot(x,y)
plt.gcf().autofmt_xdate()

plt.show()

Но опять ошибка: `минимальный предел просмотра 0.0 меньше чем 1 и является недопустимым значением даты Matplotlib. Это часто случается, если вы передаете значение, отличное от даты и времени, на ось с датой и временем

Вот некоторые снимки экрана с данными: Кадр Кадр1

Буду очень признателен за помощь! Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Если вы оставите формат столбца «Время и дата начала» без изменений по умолчанию pandas формат даты и времени и вместо этого обновите формат меток по оси x, ваш код должен работать.

import pandas as pd

frame = pd.DataFrame({'Start Time and Date': ['2013-07-01 00:00:00', '2013-07-01 00:00:02', '2013-07-01 00:01:04',
                                              '2013-07-01 00:01:06', '2013-07-01 00:01:10', '2013-08-01 00:00:00',
                                              '2013-08-01 00:00:02', '2013-09-01 00:01:04', '2013-09-01 00:01:06',
                                              '2013-10-01 00:01:10', '2013-10-01 00:02:10', '2013-11-01 00:03:10',
                                              '2013-12-01 00:03:10', '2013-12-02 00:04:10', '2013-12-03 00:05:10'],
                      'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]})

# Number of records per month
line_chart = frame.copy()
line_chart.index = pd.DatetimeIndex(line_chart['Start Time and Date'])
line_chart = pd.DataFrame(line_chart.resample('M')['index'].count())
line_chart.reset_index(inplace=True)

# Plotly
import plotly.express as px

fig = px.line(line_chart, x='Start Time and Date', y='index')
fig.update_layout(xaxis=dict(tickformat='%m-%Y'))
fig.show()

# Matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

x = line_chart['Start Time and Date']
y = line_chart['index']

fig, ax = plt.subplots(figsize=(10, 6))
plt.plot(x, y)
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%Y'))
plt.show()
...