Numpy dtype - 数据类型不明白

时间:2017-09-20 18:31:32

标签: python pandas numpy

我有一个数据框,我正在查看与每列关联的数据类型。

当我跑步时:

In [23]: df.dtype.descr

Out [24]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|O')]

我想将货币dtype设置为S7。我在做:

In [25]: dtype_new[-1] = (u'currency', "|S7")
In [26]: print dtype_new
Out [27]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|S7')]

它看起来是正确的格式。所以我试着把它放回我的df:

In [28]: df = df.astype(np.dtype(dtype_new))

我收到错误:

TypeError('data type not understood',)

我应该改变什么?谢谢。这是在我最近更新anaconda之前工作的,我不知道这个问题。感谢。

调整:

df.dtype是

In [23]: records.dtype
Out[23]: dtype((numpy.record, [(u'date', '<i8'), (u'open', '<f8'), (u'high',     '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', 'O')]))

如何更改&#39; 0&#39;一个少于7个字符的字符串?

如何更改&#39; O&#39;的最后一个dtype?别的什么?特别是一个少于7个字符的字符串。

最后 - 这是一个unicode问题吗? 使用Unicode:

In [38]: np.dtype([(u'date', '<i8')]) 
    ...: 
    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call     last)
<ipython-input-38-8702f0c7681f> in <module>()
----> 1 np.dtype([(u'date', '<i8')])

TypeError: data type not understood

没有Unicode:

In [39]: np.dtype([('date', '<i8')])
Out[39]: dtype([('date', '<i8')])

2 个答案:

答案 0 :(得分:7)

看起来你已经集中了关于unicode的观点,实际上,你似乎已经触及了一个痛点。

让我们从最后的numpy文档开始。

文档dtypes声明:

  

[(field_name, field_dtype, field_shape), ...]

     

obj应该是一个字段列表,其中每个字段由长度为2或3的元组描述。   (相当于descr属性中的__array_interface__项。)

     

第一个元素field_name是字段名称(如果是'',则分配标准字段名称'f#')。字段名称也可以是2元组的字符串,其中第一个字符串是“标题”(可以是任何字符串或unicode字符串)或字段的元数据,可以是任何对象,第二个字符串是“name”必须是有效的Python标识符。   第二个元素field_dtype可以是任何可以解释为数据类型的元素。   如果此字段表示第二个元素中数据类型的数组,则可选的第三个元素field_shape包含形状。请注意,第三个参数等于1的3元组相当于2元组。   此样式不接受dtype构造函数中的align,因为假设所有内存都由数组接口描述来解释。

因此,文档似乎并没有真正指定字段名称是否可以是unicode,我们可以从文档确定的是,如果我们将元组定义为字段名称,例如((u'date', 'date'), '<i8'),然后使用unicode作为“标题”(通知,仍然不是名称!),导致没有错误。
否则,在这种情况下,如果您定义((u'date', u'date'), '<i8'),您将收到错误。

现在,您可以使用encode("ascii")

在Py2中使用unicode名称
(u'date'.encode("ascii"))  

这应该有用。
一个重要的一点是,对于Py2,Numpy不允许将带有unicode字段名称的dtype指定为元组列表,但允许它使用字典。

如果我在Py2中不使用unicode名称,我可以将最后一个字段从|0更改为|S7,或者如果将名称定义为unicode,则必须使用encode("ascii")字符串。

所涉及的错误......

要理解为什么它会发生在您所看到的内容中,了解Numpy和Pandas中报告的错误/问题以及相关讨论是很有用的。

<强> numpy的
https://github.com/numpy/numpy/issues/2407
你可以在讨论中注意到(我在这里没有报道)主要是几件事:

  • “问题”已经持续了一段时间
  • 人们使用的一个技巧是在unicode字符串上使用encode("ascii")
  • 请记住'whatever'字符串在Py2 / 3中有不同的默认值(字节/ unicode)
  • @hpaulj本人在该问题报告中精美评论“如果dtype规范属于元组类型列表,则检查每个名称是否为字符串(由py2或3定义)但是如果dtype规范是字典{'names':[ alist], 'formats':[alist]...},py2情况下也允许使用unicode名称“

<强>熊猫
同样在熊猫方面,已经报道了一个与numpy问题有关的问题:https://github.com/pandas-dev/pandas/pull/13462
它似乎在很久以前就得到了修复。

答案 1 :(得分:0)

升级numpy后遇到此问题。此后,一些以前可以工作的代码突然停止工作。重新安装numpy为我解决了这个问题:

  

pip install --upgrade --force-reinstall numpy