为什么 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.])
显然这是返回一个数字而不是数据时间对象。
我正在尝试获取要在此处的 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.])
显然这是返回一个数字而不是数据时间对象。