Построение данных из словаря с датами с использованием Matplotlib - PullRequest
0 голосов
/ 02 октября 2018

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

В прикрепленном коде есть только небольшая часть реального словаря, но этого достаточно, чтобы показать проблему:

from matplotlib import pyplot as plt

dictionary = {'2015-11-15': 318, '2015-11-16': 3, '2015-11-18': 147, '2015-11-20': 38, 
'2015-11-22': 128,'2015-11-23': 37, '2015-11-24': 5, '2015-11-25': 3, '2015-11-26': 323, 
'2015-11-27': 478,'2015-11-28': 49, '2015-11-29': 9,'2015-12-11': 172, '2015-12-13': 219, 
'2015-12-16': 1,'2015-12-17': 10, '2015-12-18': 25, '2015-12-19': 3, '2015-12-2': 147, 
'2015-12-21': 133}

x = list(dictionary.keys())
y = list(dictionary.values())

plt.plot_date(x,y, xdate=True)
plt.xticks(x, rotation='vertical')
plt.show()

Любая идея, как отредактировать код, чтобы показать сюжет в правильномпуть?Нужно ли сортировать словарь, чтобы выстроить даты в хронологическом порядке, или он автоматически разместит их в нужном месте?

  1. Ссылка 1 - метки даты
  2. Ссылка 2 - matplotlib.pyplot.plot_date
  3. Ссылка 3 - Демо-версия Дата
  4. Ссылка 4 - API дат

Возможное решение?

  1. Построение дат и связанных значений из словаря с Matplotlib

1 Ответ

0 голосов
/ 02 октября 2018

Хорошо, поэтому, посмотрев на возможное решение, я решил отформатировать свои данные из строки DD-MM-YYYY в кортеж (YYYY, MM, DD).Затем я отправил эту информацию в словарь и распаковал ее с * в качестве аргумента для datetime.date.Остальное как в примере со ссылкой.

Полный код моей программы:

Небольшой кусок данных из new.txt (оригинал превышает 12 МБ):

=A=
=A=
XDD
29September201821:54
=F=
nice,urodzinymateriinieozywionej
29September201821:54
=A=
urodzinygaleriijurajskiejsaxd
29September201821:53
=A=
jakasgwiazdeczka
29September201821:53
=F=
czytakosamaona
29September201821:53
=F=
tenkocertjakoczescewentujakiegoswiekszego
29September201821:53
=F=
nieznaju
29September201821:52
=A=
koncertsylwiigrzeszczakbylxdnawetfajniegraja
29September201821:48
=A=

29September201821:48
=A=
XDD
29September201816:03
=F=
ladnie
29September201816:03
=F=
wbrystolu
29September201816:03
=F=
niewiemgdziejestem,brawo
29September201816:03
=F=
xD
29September201816:03
=F=
nawetnie
29September201816:03
=F=
anie
29September201816:03
=A=
OMGZUZKAsentaphoto.

29September201816:02
=F=
jawbathjestemzjarkiem
29September201816:02
=A=
Niebomalebylyxd
29September201816:02
=F=
cosznalazlaswtychjaskiniach?
29September201816:02
=A=
RondowolsztyniexD
29September201816:02
=A=
OMGZUZKAsentaphoto.

29September201816:02
=F=

29September201816:01
=A=

29September201816:01
=A=
Oh
29September201816:01
=F=
amniegorszeodrzucaja
29September201816:01
=F=
nie,boinnesazawszegorszenizzuzka
29September201816:01
=A=
Tytakmawiasz?XD
29September201816:00
=F=
kok
29September201815:51
=F=
xd
29September201815:51

Полный код для работы с файлом:

import re
from matplotlib import pyplot as plt
import datetime

def month(date):
    if "January" in date:
        return 1
    elif "February" in date:
        return 2
    elif "March" in date:
        return 3
    elif "April" in date:
        return 4
    elif "May" in date:
        return 5
    elif "June" in date:
        return 6
    elif "July" in date:
        return 7
    elif "August" in date:
        return 8
    elif "September" in date:
        return 9
    elif "October" in date:
        return 10
    elif "November" in date:
        return 11
    elif "December" in date:
        return 12
    else:
        pass

messages = open("new.txt","r").read()
dates = []

date_2digits = re.finditer('^[0-9][0-9][A-Z][a-z]*[0-9]{6}[:][0-9]{2}', messages, flags=re.MULTILINE)
date_1digit  = re.finditer('^[0-9][A-Z][a-z]*[0-9]{6}[:][0-9]{2}', messages, flags=re.MULTILINE)

for _ in date_2digits:
    txt = str(_.group(0))
    dates.append((int(txt[-9:-5]),month(txt),int(txt[0:2])))

for _ in date_1digit:
    txt = str(_.group(0))
    dates.append((int(txt[-9:-5]), int(month(txt)), int(txt[0:1])))

dates_dict = {}

for entry in dates:
    date = datetime.date(*entry)
    if date not in dates_dict.keys():
        dates_dict[date]=int(1)
    elif date in dates_dict.keys():
        add = dates_dict[date] + 1
        dates_dict.update({date:add})

x = list(dates_dict.keys())
y = list(dates_dict.values())

#plt.plot_date(x,y,'.')
plt.bar(x,y)
plt.xticks(x, rotation='vertical')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...