Чтение меток времени из txt.file и вывод их на ось X с помощью matplotlib (веб-сервер) - PullRequest
0 голосов
/ 25 июня 2018

Я создал веб-приложение с Python и Pyramid, которое извлекает самую последнюю электронную почту из gmail, сохраняет данные в файл, а затем отображает данные с помощью matplotlib и преобразует их в строку html с помощью mpld3.В настоящее время в моих электронных письмах содержатся данные в следующей форме:

17  25

18  25

19  25

20  26

У меня нет проблем с отображением этих данных.Однако я хотел бы отобразить данные в той же форме, но с временными метками, например так:

25-06-2018 9:11  25

25-06-2018 9:12  25

25-06-2018 9:13  25

...

Я пытался преобразовать данные в формат даты и времени, но безуспешно.Вот мой код:

from pyramid.config import Configurator
from pyramid.response import Response
import email
import getpass
import imaplib
import os
import re
import numpy as np
import matplotlib.pyplot as plt, mpld3

def imaptest(request):

    m = imaplib.IMAP4_SSL('imap.gmail.com')
    m.login('email@gmail.com', 'password')
    m.list()
    m.select('inbox')

    result, data = m.uid('search', None, 'UNSEEN')

    i = len(data[0].split()) #space separate string

    for x in range(i):
        latest_email_uid = data[0].split()[x]
        result, email_data = m.uid('fetch', latest_email_uid, '(RFC822)')
        raw_email = email_data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = email.message_from_string(raw_email_string)


        for part in email_message.walk():
            if part.get_content_type() == 'text/plain':
                body = part.get_payload(decode=True)
                save_string = str('C:\Email\mail1' + str(x) + '.txt')
                myfile = open(save_string, 'a')
                myfile.write(str(body))
                myfile.close
            else:
                continue

        with open('C:\Email\mail10.txt') as f:
            lines = f.readlines()
            x = [int(line.split()[0]) for line in lines]
            y = [int(line.split()[1]) for line in lines]

            fig = plt.figure()
            ax1 = fig.add_subplot(111)
            ax1.set_title('Test Graph')
            ax1.set_xlabel('Time')
            ax1.set_ylabel('Temperature')

            plt.plot(x,y)


    # Print as HTML
            return Response(   
            mpld3.show()
            )

config = Configurator()
config.add_route('imaptest', '/imaptest')
config.add_route('landingpage', '/landingpage')
config.add_view(landingpage, route_name='landingpage')
config.add_view(imaptest, route_name='imaptest')
app = config.make_wsgi_app()

1 Ответ

0 голосов
/ 26 июня 2018

Через некоторое время я понял это.

Во-первых, мне нужно преобразовать мои значения времени в строковые массивы, а не в массивы int:

lines = f.readlines()
dates = [str(line.split()[0]) for line in lines]

Затем я преобразую массив вМассив типа datetime с модулем datetime:

from datetime import datetime
date = [datetime.strptime(x,'%d-%m-%Y/%H:%M') for x in dates]

Затем я просто отображаю дату и время на оси X и мои значения на оси Y с помощью matplotlib:

plt.subplot(2,1,1)      
plt.title('Temperature & Humidity')
plt.ylabel('Temperature' + u'\u2103')
plt.plot_date(date, y, 'r.-')

Вот весь кодна тот случай, если кто-то другой может его использовать:

import numpy as np
import matplotlib.pyplot as plt, mpld3
from datetime import datetime



def landingpage(request):

    with open('C:\Email\mail10.txt') as f:
        lines = f.readlines()
        dates = [str(line.split()[0]) for line in lines]
        y = [float(line.split()[1]) for line in lines]
        z = [float(line.split()[2]) for line in lines]

        date = [datetime.strptime(x,'%d-%m-%Y/%H:%M') for x in dates]

        plt.subplot(2,1,1)

        plt.title('Temperature & Humidity')
        plt.ylabel('Temperature' + u'\u2103')
        plt.plot_date(date, y, 'r.-')


        plt.subplot(2,1,2)
        plt.plot_date(date, z, 'b.-')
        plt.xlabel('Time')
        plt.ylabel('Humidity RH%'.decode('unicode-escape'))






    # Print as HTML
        return Response(   
        mpld3.show()
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...