Преобразовать строку в дату matplotlib для печати - PullRequest
0 голосов
/ 17 марта 2020

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

Код


import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates
import datetime

def graph_data():

    fig=plt.figure()
    ax1=plt.subplot2grid((1,1),(0,0))

    stock_price_url = 'https://pythonprogramming.net/yahoo_finance_replacement'
    source_code = urllib.request.urlopen(stock_price_url).read().decode()

    stock_data = []
    split_source=source_code.split('\n')

    print(len(split_source))

    for line in split_source[1:]:
        stock_data.append(line)


    date,openn,closep,highp,lowp,openp,volume=np.loadtxt(stock_data,delimiter=',',unpack=True)

    x = [datetime.strptime(d, '%Y-%m-%d') for d in date]

    ax1.plot_date(x,closep,'-',linewidth=0.1)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('Graph')
    plt.show()

graph_data()

Любой метод преобразования просто выдает ту же ошибку

ValueError: не удалось преобразовать строку в число с плавающей точкой: '2017-07-26'

Какой метод можно использовать для преобразования строки в дату, которая может быть нанесена на график

1 Ответ

0 голосов
/ 17 марта 2020

Нет ничего плохого в вашем коде. Проблема с данными. Если вы посмотрите на данные, то обнаружите, что от даты к объему объектов ваши данные представляют собой строку, подобную этой: data = '2017-07-26,153.3500,153.9300,153.0600,153.5000,153.5000,12778195.00'. Это представление строки. Поэтому сначала вам нужно выполнить некоторую предварительную обработку. Для этого могут быть разные методы. Я нашел этот метод полезным для меня:

Сначала вы должны удалить запятые в данных и заменить их пробелами, а затем использовать функцию разделения для преобразования данных в формат разделения.

Итак Вам нужно внести следующие изменения в свой код:

date = []
closep = []
for i in range(len(stock_data)):
    temp = stock_data[i].replace(',', ' ').split()
    date.append(temp[0])
    closep.append(temp[2])

0 и два - это позиции даты и закрытия в вашем наборе данных.

Теперь вместо 'x' и 'closep' как вы использовали в своем методе построения графика, используйте эти «date» и «closep», которые я только что поделился с вами с помощью кода.

Еще одна вещь заключается в том, что у графика возникают проблемы с этим большим набором данных, я думаю. Поэтому используйте date [0: 100], closep [0: 100], чтобы попробовать график для меньшего набора данных.

Полный код будет выглядеть так:

import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates
import datetime


def graph_data():
    fig = plt.figure()
    ax1 = plt.subplot2grid((1, 1), (0, 0))

    stock_price_url = 
   'https://pythonprogramming.net/yahoo_finance_replacement'
    source_code = urllib.request.urlopen(stock_price_url).read().decode()

    stock_data = []
    split_source = source_code.split('\n')

    for line in split_source[1:]:
        stock_data.append(line)

    date = []
    closep = []
    for i in range(len(stock_data)):
        temp = stock_data[i].replace(',', ' ').split()
        date.append(temp[0])
        closep.append(temp[2])

    ax1.plot_date(date[0:100], closep[0:100], '-', linewidth=0.1)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('Graph')
    plt.show()


graph_data()

Надеюсь, это поможет.

...