numpy UnicodeDecodeError我是否对genfromtxt使用正确的方法

塞克森

我被困住了。我想将一个简单的csv文件读取到一个Numpy数组中,似乎已经陷入困境。我是Numpy的新手,我确定我已经以某种方式弄乱了它,因为通常我可以在Python 3.4中轻松读取CSV文件。我不想使用Pandas,所以我想我会使用Numpy来提高我的技能,但是我真的一点都没有。如果有人可以使用genfromtxt告诉我我是否走在正确的轨道上,或者有什么更简单的方法向我正确的方向走,我将不胜感激。我想读取CSV文件,将datetime列设置为2014年8月4日,然后将其与其余列一起放入numpy数组中。这是我到目前为止所遇到的问题以及我在编码时遇到的错误。我可以在那里获得日期的一部分,但看不到如何将date.strftime(“%Y-%m-%d”)添加到datefunc。另外,我也看不到如何格式化SYM字符串以解决该错误。任何帮助,将不胜感激。

数据

 2015-08-04 02:14:05.249392, AA, 0.0193103612, 0.0193515212, 0.0249713335, 30.6542480634, 30.7195875454, 39.640763021, 0.2131498442, 29.0406746589, 13524.5347810182, 89, 57, 99 
 2015-08-04 02:14:05.325113, AAPL, 0.0170506271, 0.0137941891, 0.0105915637, 27.0670313481, 21.8975963326, 16.8135861893, -19.0986405157, -23.2172064279, 21.5647072302, 33, 26, 75 
 2015-08-04 02:14:05.415193, AIG, 0.0080808151, 0.0073296055, 0.0076213535, 12.8278962785, 11.635388035, 12.0985236788, -9.2962105215, 3.980405659, -142.8175077335, 71, 42, 33 
 2015-08-04 02:14:05.486185, AMZN, 0.0235649449, 0.0305828226, 0.0092703502, 37.4081902773, 48.5487257749, 14.7162247572, 29.7810062852, -69.6877219282, -334.0005615016, 2, 92, 10 

对不起,“代码”仍然在学习

import numpy as np

from datetime import datetime
from datetime import date,time


datefunc = lambda x: datetime.strptime(x.decode("utf-8"), '%Y-%m-%d %H:%M:%S.%f')
a = np.genfromtxt('/home/dave/Desktop/development/hvanal2016.csv',delimiter = ',',
converters = {0:datefunc},dtype='object,str,float,float,float,float,float,float,float,float,float,float,float,float',
names = ["date","sym","20sd","10sd","5sd","hv20","hv10","hv5","2010hv","105hv","abshv","2010rank","105rank","absrank"])

print(a["date"])
print(a["sym"])
print(a["20sd"])
print(a["hv20"])
print(a["absrank"])

错误

Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "copyright", "credits" or "license()" for more information.
>>> 
============================================================================== RESTART: /home/dave/3 9 15 my slope.py ===============================================================================
[datetime.datetime(2015, 8, 4, 2, 14, 5, 249392)
 datetime.datetime(2015, 8, 4, 2, 14, 5, 325113)
 datetime.datetime(2015, 8, 4, 2, 14, 5, 415193) ...,
 datetime.datetime(2016, 3, 18, 1, 0, 25, 925754)
 datetime.datetime(2016, 3, 18, 1, 0, 26, 26400)
 datetime.datetime(2016, 3, 18, 1, 0, 26, 114828)]
 Traceback (most recent call last):
 File "/home/dave/3 9 15 my slope.py", line 19, in <module>
  print(a["sym"])
 File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 1615, in array_str
 return array2string(a, max_line_width, precision, suppress_small, ' ', "", str)
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 454, in array2string
separator, prefix, formatter=formatter)
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 328, in _array2string
_summaryEdgeItems, summary_insert)[:-1]
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 490, in _formatArray
word = format_function(a[i]) + separator
UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000) 
hpaulj

因此,您的文字部分是

b'2015-08-04 02:14:05.249392 AA 0.0193103612 ...'

(我正在使用,b因为Py3会genfromtxt以字节串形式打开文件)。

但是您指定一个,定界符。我看不到逗号。

让我们只尝试基本负载,而不是花哨的业务。

In [97]: txt=b"""2015-08-04 02:14:05.249392 AA 0.0193103612 0.0193515212 0.0249713335 30.6542480634 30.7195875454 39.640763021 0.2131498442 29.0406746589 13524.5347810182 89 57 99 
 2015-08-04 02:14:05.325113 AAPL 0.0170506271 0.0137941891 0.0105915637 27.0670313481 21.8975963326 16.8135861893 -19.0986405157 -23.2172064279 21.5647072302 33 26 75 
 """
In [98]: txt=txt.splitlines()
In [99]: data=np.genfromtxt(txt,dtype=None)
In [100]: data
Out[100]: 
array([ (b'2015-08-04', b'02:14:05.249392', b'AA', 0.0193103612, 0.0193515212, 0.0249713335, 30.6542480634, 30.7195875454, 39.640763021, 0.2131498442, 29.0406746589, 13524.5347810182, 89, 57, 99),
       (b'2015-08-04', b'02:14:05.325113', b'AAPL', 0.0170506271, 0.0137941891, 0.0105915637, 27.0670313481, 21.8975963326, 16.8135861893, -19.0986405157, -23.2172064279, 21.5647072302, 33, 26, 75)], 
      dtype=[('f0', 'S10'), ('f1', 'S15'), ('f2', 'S4'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<f8'), ('f9', '<f8'), ('f10', '<f8'), ('f11', '<f8'), ('f12', '<i4'), ('f13', '<i4'), ('f14', '<i4')])

日期时间信息在2个字段中:

In [101]: data[['f0','f1']]
Out[101]: 
array([(b'2015-08-04', b'02:14:05.249392'),
       (b'2015-08-04', b'02:14:05.325113')], 
      dtype=[('f0', 'S10'), ('f1', 'S15')])

您的datefunction确实可以使用字节子字符串

In [102]: datefunc(b'2015-08-04 02:14:05.249392')
Out[102]: datetime.datetime(2015, 8, 4, 2, 14, 5, 249392)

但是它需要2个字段(由''分隔符定义)。因此,我们需要找出一种将这两个子字符串解析为一个而不是拆分为两个字段的方法。

也许我会尝试将示例更改txt为真正使用,定界符(但不要在日期和时间之间)并设置有效的方法。


使用定,界文本,我得到:

In [117]: data=np.genfromtxt(txt,delimiter=',',dtype=None,usecols=[0,1,2,3])
In [118]: data.dtype
Out[118]: dtype([('f0', 'S26'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')])
In [119]: data['f0']
Out[119]: 
array([b'2015-08-04 02:14:05.249392', b'2015-08-04 02:14:05.325113',
       b'2015-08-04 02:14:05.415193', b'2015-08-04 02:14:05.486185'], 
      dtype='|S26')
In [120]: [datefunc(d) for d in data['f0']]
Out[120]: 
[datetime.datetime(2015, 8, 4, 2, 14, 5, 249392),
 datetime.datetime(2015, 8, 4, 2, 14, 5, 325113),
 datetime.datetime(2015, 8, 4, 2, 14, 5, 415193),
 datetime.datetime(2015, 8, 4, 2, 14, 5, 486185)]

我使用它usecols是因为全文在第一行有14个字段,在其他行有13个字段。

如果指定dtype(而不是easy None),则可以使用以下datetime对象替换1st字段中的字符串:

In [122]: data=np.genfromtxt(txt,delimiter=',',dtype='O,S5,f,f',usecols=[0,1,2,3])
In [123]: data
Out[123]: 
array([ (b'2015-08-04 02:14:05.249392', b' AA', 0.01931036077439785, 0.019351521506905556),
       (b'2015-08-04 02:14:05.325113', b' AAPL', 0.01705062761902809, 0.01379418931901455),....], 
      dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f4'), ('f3', '<f4')])
In [124]: data['f0']
Out[124]: 
array([b'2015-08-04 02:14:05.249392', b'2015-08-04 02:14:05.325113',
       b'2015-08-04 02:14:05.415193', b'2015-08-04 02:14:05.486185'], dtype=object)
....
In [126]: data['f0']=[datefunc(d) for d in data['f0']]
In [127]: data
Out[127]: 
array([ (datetime.datetime(2015, 8, 4, 2, 14, 5, 249392), b' AA', 0.01931036077439785, 0.019351521506905556),
       (datetime.datetime(2015, 8, 4, 2, 14, 5, 325113), b' AAPL', 0.01705062761902809, 0.01379418931901455),...], 
      dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f4'), ('f3', '<f4')])

并通过转换器,您的通话(或多或少)可以正常工作

In [133]: data=np.genfromtxt(txt,dtype='object,S5,float,float',
   converters = {0:datefunc},delimiter=',',usecols=[0,1,2,3])
In [134]: data
Out[134]: 
array([ (datetime.datetime(2015, 8, 4, 2, 14, 5, 249392), b' AA', 0.0193103612, 0.0193515212),
       (datetime.datetime(2015, 8, 4, 2, 14, 5, 325113), b' AAPL', 0.0170506271, 0.0137941891),...], 
      dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')])

the numpy datetime64使用此字符串。这些类型可以使用numpy数字。

In [154]: datefunc(b'2015-08-04 02:14:05.249392')
Out[154]: datetime.datetime(2015, 8, 4, 2, 14, 5, 249392)
In [155]: np.datetime64(b'2015-08-04 02:14:05.249392')
Out[155]: numpy.datetime64('2015-08-04T02:14:05.249392-0700')

通过将此csv导入Numpy datetime64中,我可以使用此功能:

In [175]: data=np.genfromtxt(txt,dtype='M8[us],S5,float,float',
   delimiter=',',usecols=[0,1,2,3])
In [176]: data
Out[176]: 
array([ (datetime.datetime(2015, 8, 4, 9, 14, 5, 249392), b' AA', 0.0193103612, 0.0193515212),
       (datetime.datetime(2015, 8, 4, 9, 14, 5, 325113), b' AAPL', 0.0170506271, 0.0137941891),...], 
      dtype=[('f0', '<M8[us]'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')])

请参阅以获取日期时间单位:http : //docs.scipy.org/doc/numpy/reference/arrays.datetime.html#datetime-units

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用numpy.genfromtxt读取单行CSV

来自分类Dev

使用numpy.genfromtxt进行过滤

来自分类Dev

numpy.genfromtxt无法正确读取布尔数据

来自分类Dev

是否可以在numpy.genfromtxt输出中添加新字段?

来自分类Dev

用numpy的genfromtxt读取第n行的最快方法

来自分类Dev

numpy中genfromtxt的注释参数

来自分类Dev

使用numpy.genfromtxt时如何保留以减号开头的列名?

来自分类Dev

使用numpy.genfromtxt从文件读取数据时跳过行

来自分类Dev

使用numpy的genfromtxt用python加载三角矩阵

来自分类Dev

使用numpy.genfromtxt从文件读取数据时跳过行

来自分类Dev

将辅助函数与numpy.genfromtxt()一起使用

来自分类Dev

使用numpy.genfromtxt读取sqlite3.Binary对象

来自分类Dev

正确使用numpy插值

来自分类Dev

如何正确使用numpy hstack

来自分类Dev

使用numpy数组从方法创建numpy数组

来自分类Dev

如何使用numpy.genfromtxt将较低的三角矩阵读入numpy数组?

来自分类Dev

测试numpy.dtype的正确方法

来自分类Dev

使用numpy.insert附加numpy数组

来自分类Dev

numpy.genfromtxt没有解包

来自分类Dev

从numpy.genfromtxt获取标题行

来自分类Dev

多列日期时间的numpy genfromtxt问题

来自分类Dev

numpy.genfromtxt导入元组而不是数组

来自分类Dev

numpy.genfromtxt转换功能错误

来自分类Dev

genfromtxt numpy之后的空字符串

来自分类Dev

numpy.genfromtxt似乎忽略了dtype

来自分类Dev

numpy.genfromtxt导入元组而不是数组

来自分类Dev

从python中的numpy genfromtxt获取列名

来自分类Dev

genfromtxt 返回未用逗号分隔的 numpy 数组

来自分类Dev

使用Numpy的成对vdot