如何使用 datestr2num 而不是 strpdate2num

Joh*_*n Q 3 python numpy matplotlib

strpdate2num 类在 Matplotlib 3.1 中已弃用,并将在 3.3 中删除。使用 time.strptime 或 dateutil.parser.parse 或 datestr2num 代替。但是我尝试了不同的方法并且不断收到错误,最常见的错误消息是 ValueError: ('Unknown string format:', '%Y-%m-%d')

我试过 time.strptime、dateutil.parser.parse 和 datestr2num,但这些都不正确,我不知道我做错了什么

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

def bytespdate2num(fmt, encoding='utf-8'):
    strconverter = mdates.datestr2num(fmt)
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter


def graph_data(stock):
    # Unfortunately, Yahoo's API is no longer available
    # feel free to adapt the code to another source, or use this drop-in replacement.
    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:]:
        split_line = line.split(',')
        if len(split_line) == 7:
            if 'values' not in line and 'labels' not in line:
                stock_data.append(line)

    date, closep, highp, lowp, openp, adj_closep, volume = np.loadtxt(  stock_data,
                                                                        delimiter=',',
                                                                        unpack=True,
                                                                        # %Y = full year. 2015
                                                                        # %y = partial year 15
                                                                        # %m = number month
                                                                        # %d = number day
                                                                        # %H = hours
                                                                        # %M = minutes
                                                                        # %S = seconds
                                                                        # 12-06-2014
                                                                        # %m-%d-%Y
                                                                        converters={0: bytespdate2num('%Y-%m-%d')})

    plt.plot_date(date, closep,'-', label='Price')

    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title('Interesting Graph\nCheck it out')
    plt.legend()
    plt.show()


graph_data('TSLA')
Run Code Online (Sandbox Code Playgroud)

ValueError: ('未知字符串格式:', '%Y-%m-%d')

Imp*_*est 6

您的日期格式似乎很常见,所以strconverter = mdates.datestr2num应该可以工作(没有 fmt 参数)。当然,在这种情况下,完整的转换器可以简化为

def bytespdate2num(b):
    return mdates.datestr2num(b.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

并像使用它一样

converters={0: bytespdate2num}
Run Code Online (Sandbox Code Playgroud)