[英]Numpy dtype - data type not understood
我有一個數據框,我正在查看與每列關聯的數據類型。
當我運行時:
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')]))
如何將“0”更改為少於 7 個字符的字符串?
如何將最后一個 dtype 從 'O' 更改為其他類型? 特別是少於 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')])
看來您已經將重點放在了 unicode 上,實際上,您似乎觸及了一個痛點。
讓我們從最后一個 numpy 文檔開始。
文檔dtypes指出:
[(field_name, field_dtype, field_shape), ...]
obj 應該是一個字段列表,其中每個字段由長度為 2 或 3 的元組描述。(相當於
__array_interface__
屬性中的descr
項。)第一個元素
field_name
是字段名稱(如果這是''
',則分配標准字段名稱 'f#')。 字段名稱也可以是一個 2 元組的字符串,其中第一個字符串是“標題”(可以是任何字符串或 unicode 字符串)或字段的元數據,可以是任何對象,第二個字符串是“名稱”必須是有效的 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的不允許指定dtype
使用Unicode字段名稱的元組的列表,但允許它使用字典。
如果我不在 Py2 中使用 unicode 名稱,我可以將最后一個字段從|0
更改為|S7
或者如果您將名稱定義為 unicode 字符串,則必須使用encode("ascii")
。
和涉及的錯誤......
要了解為什么會發生這種情況,查看 Numpy 和 Pandas 中報告的錯誤/問題以及相關討論很有用。
麻木
https://github.com/numpy/numpy/issues/2407
你可以在討論中注意到(我不在這里報告)主要有幾件事:
encode("ascii")
'whatever'
字符串在 Py2/3 中具有不同的默認值(字節/Unicode){'names':[ alist], 'formats':[alist]...}
,py2 大小寫也允許 unicode 名稱“ 熊貓
同樣在熊貓方面,已經報告了一個與 numpy 問題相關的問題: https : //github.com/pandas-dev/pandas/pull/13462
好像不久前就修好了。
升級numpy后我遇到了這個問題。 一些以前工作的代碼在那之后突然停止工作。 重新安裝 numpy 為我解決了這個問題:
pip install --upgrade --force-reinstall numpy
更新
我剛剛再次遇到同樣的問題,並在這里找到了解決方案。 我更新了庫 pandas、matplotlib 和 seaborn 以(重新)啟用我的基於 numpy 的渲染:
pip install --upgrade pandas matplotlib seaborn
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.