为什么 datetime.strptime 不能与 numpy 一起工作给出' float() 参数必须是字符串或数字,而不是 'datetime.datetime' '

Why does datetime.strptime not work with numpy giving ' float() argument must be a string or a number, not 'datetime.datetime' '

我正在尝试获取要在此处的 numpy 数组 (datep) 中使用的日期时间类型。我已经尝试过函数 bytespdates2num 的方法。

首先是:

    def bytespdates2num(fmt,encoding = 'utf-8'):
        def bytesconverter(b):
            s = b.decode(encoding)
            return mdate.datestr2num(s)
        return bytesconverter

第二个是:

    def bytespdates2num(fmt, encoding = 'utf-8'):
        def bytesconverter(b):
            s = b.decode(encoding)
            return datetime.datetime.strptime(s)
        return bytesconverter

我的代码是:

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

#First or second approach
def bytespdates2num(fmt, encoding = 'utf-8'):
     def bytesconverter(b):
         #makes it into string from utf-8 encoding format
        s  = b.decode(encoding)
        return datetime.datetime.strptime(s,fmt)
     return bytesconverter

url1 = 'https://pythonprogramming.net/yahoo_finance_replacement'
data = urllib.request.urlopen(url1,context = None).read().decode()
stockprices = list()
stocksplitdata = data.split('\n')
for line in stocksplitdata:
    stockprices.append(line)

date,openp,highp,lowp,closep,adjust,vol = np.loadtxt(stockprices[1:],delimiter = ',',\
                                                     unpack = True,\
                                                     converters = {0:bytespdates2num('%Y-%m-%d')})

虽然第一种方法有效并且我可以使用 datep 作为 x 轴继续绘制 matplotlib 图,但第二种方法失败 float() argument must be a string or a number, not 'datetime.datetime 。但是,在调试时,运行 命令行上的 datetime.datetime.strptime(s) 行给出了 s 的日期时间对象。为什么会这样? datetime 方法也将字符串格式日期转换为日期时间格式,而且看起来也更直接。

即使您指定了一个转换器,您仍然需要指定一个 dtype

我试着用一个简单的输入来重新创建你的案例(你为什么不为我们做这个???)

In [20]: txt = """2011-01-23 
    ...: 2020-03-23"""

您的第二个转换器(您的一个缺少 fmt):

In [21]: def bytespdates2num(fmt, encoding = 'utf-8'): 
    ...:         def bytesconverter(b): 
    ...:             s = b.decode(encoding) 
    ...:             return datetime.datetime.strptime(s, fmt) 
    ...:         return bytesconverter 
    ...:                                                                                       

您的 运行,具有完整的 TRACEBACK!

In [22]: np.loadtxt(txt.splitlines(), converters={0:bytespdates2num('%Y-%m-%d')})              
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-56c1854d614f> in <module>
----> 1 np.loadtxt(txt.splitlines(), converters={0:bytespdates2num('%Y-%m-%d')})

/usr/local/lib/python3.6/dist-packages/numpy/lib/npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding, max_rows)
   1159         for x in read_data(_loadtxt_chunksize):
   1160             if X is None:
-> 1161                 X = np.array(x, dtype)
   1162             else:
   1163                 nshape = list(X.shape)

TypeError: float() argument must be a string or a number, not 'datetime.datetime'

loadtxt 的默认 dtype 是浮点数。它有 read_data(作为列表的列表),现在正尝试使用默认值 dtype.

将其转换为数组

如果我将 object 指定为 dtype:

In [23]: np.loadtxt(txt.splitlines(), converters={0:bytespdates2num('%Y-%m-%d')}, dtype=object)
    ...:                                                                                       
Out[23]: 
array([datetime.datetime(2011, 1, 23, 0, 0),
       datetime.datetime(2020, 3, 23, 0, 0)], dtype=object)

或者我可以指定一个 datetime64 dtype:

In [24]: np.loadtxt(txt.splitlines(), converters={0:bytespdates2num('%Y-%m-%d')}, dtype='datetime64[D]')                                                                             
Out[24]: array(['2011-01-23', '2020-03-23'], dtype='datetime64[D]')

抱歉,上限,但我厌倦了要求回溯和示例输入。提供这些对于 SO 问题应该是强制性的。

mdates(代码中未更正):

In [30]:     def bytespdates2num(fmt,encoding = 'utf-8'): 
    ...:         def bytesconverter(b): 
    ...:             s = b.decode(encoding) 
    ...:             return mdates.datestr2num(s) 
    ...:         return bytesconverter 
    ...:                                                                                       
In [31]: np.loadtxt(txt.splitlines(), converters={0:bytespdates2num('%Y-%m-%d')})              
Out[31]: array([734160., 737507.])

显然这是返回一个数字而不是数据时间对象。