Meio Ambiente
Ao chamar numpy.loadtxt
em um arquivo contendo strings como segue:
import numpy as np
datestxt = np.loadtxt("NYSE_dates.txt", dtype=str)
print(datetxt)
Onde NYSE_dates.txt é simplesmente uma lista de datas (pode ser qualquer coisa):
7/5/1962
7/6/1962
7/9/1962
...
12/29/2020
12/30/2020
12/31/2020
O resultado é:
["b'7/5/1962'" "b'7/6/1962'" "b'7/9/1962'" ..., "b'12/29/2020'"
"b'12/30/2020'" "b'12/31/2020'"]
Como você pode ver, todas as strings foram lançadas em bytes e, em seguida, transformadas em string por meio de conv
, pois você obteria o mesmo resultado de str(str('12/31/2020').encode('latin1'))
, por conv
& compat.asbytes
.
Depois de examinar o código, parece que todas as strings são convertidas em bytes com asbytes(...)
praticamente por toda parte, como por exemplo em split_line(...)
, então isso deve significar que todas as rotinas no módulo estão quebradas.
Eu também tenho esse problema. Isso é muito chato; basicamente você não pode usar loadtxt em Python3.
Solução temporária: removi todas as chamadas asbytes () no método loadtxt.
Sim, lembro-me de ter pensado que havia algo suspeito ali quando olhei o código.
Para registro, estou tendo o mesmo problema com entradas datetime64, levando a um erro de análise do formulário: Error parsing datetime string "b'2013-01-02'"
. Para contornar isso, tive que criar um conversor para essa coluna:
def decoder(input_bytes):
return input_bytes.decode("ascii")
Isso seria bom no código de produção, mas não é nada bonito para o material de treinamento ...
Avançando para 1.11.
solução alternativa - execute primeiro o iconv no arquivo.
empurrando para 1,12.
Vejo que isso está sendo adiado, mas acho que é um bug que deve ser corrigido e uma correção parece ser facilmente implementada.
Muito chocante que isso não tenha sido corrigido por 5 anos
Parece que isso está funcionando como desejado no NumPy 1.13.3 (embora eu não tenha certeza de qual PR corrigiu isso). Este problema pode ser resolvido?
>>> import io
>>> import numpy as np
>>> f = io.StringIO("7/5/1962\n7/6/1962\n")
>>> np.loadtxt(f, dtype=str)
array(['7/5/1962', '7/6/1962'],
dtype='<U8')
>>> np.__version__
'1.13.3'
Parece que isso foi corrigido em # 8349, em resposta a # 8033.
Fechando. Reabra se necessário.
Comentários muito úteis
Muito chocante que isso não tenha sido corrigido por 5 anos