我用:
创建了一个数组Ticket_data = np.empty((0,7),
dtype='str,datetime64[m],datetime64[m],str,str,str,str')
我试图用以下内容追加数据:
lineitem = [str(data[0][0]), OpenDT, CloseDT, str(data[0][11]),
str(data[0][12]), str(data[0][13]), str(data[0][14])]
使用OpenDT
CloseDT
和np.datetime64(DTstring, 'm')
的位置
我收到错误:
Traceback (most recent call last):
File "Daily Report.py", line 25, in <module>
np.append(Ticket_data, np.array([lineitem]), axis=0)
File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 3884, in append
return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion
编辑:
print np.array([lineitem])
输出
[['21539' '2015-06-30T10:46-0700' '2015-06-30T10:55-0700' 'Testtext'
'Testtext2' 'Testtext3' 'Testtext5']]
和
print np.array([lineitem], dtype=Ticket_data.dtype)
输出
[[('', 245672259890L, datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
('', datetime.datetime(2015, 6, 30, 17, 46), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
('', datetime.datetime(2015, 6, 30, 17, 55), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
('', 7741528753124368710L, datetime.datetime(1982, 11, 21, 6, 33), '', '', '', '')
('', 7959953343691844691L, datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
('', datetime.datetime(5205, 7, 21, 7, 42), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
('', 2336635297857499728L, 2338042681633169744L, '', '', '', '')]]
我该怎么做才能解决这个问题?
答案 0 :(得分:4)
首先,结构化数组中的 fields 与常规ndarray中的维度不同。您希望Ticket_label
数组 1维,但该维度中的每个行元素都包含 7个字段,例如:
Ticket_data = np.empty((0,),
dtype='str,datetime64[m],datetime64[m],str,str,str,str')
现在,为了将lineitem
连接到Ticket_data
,首先必须将它从嵌套列表隐式转换为数组。由于您没有为每个字段指定单独的dtype
,因此numpy会将lineitem
视为同构数组,并找到可以安全地提升每个元素的公共dtype
。< / p>
例如:
lineitem = ['foo', np.datetime64('1979-03-22T19:00', 'm'),
np.datetime64('1979-03-22T19:00', 'm'), 'bar', 'baz', 'a', 'b']
np.array(lineitem)
# array(['21539', '2015-06-30T10:46-0700', '2015-06-30T10:55-0700',
# 'Testtext', 'Testtext2', 'Testtext3', 'Testtext5'],
# dtype='|S21')
在此示例中,每个元素都转换为21个长的字符串。此数组的dtype
与Ticket_data
的数组不匹配,由于没有安全的方式将'|S21'
转换为'np.datetime64[m]'
,因此会出现invalid type promotion
错误。
您可以通过将lineitem
显式地转换为数组来避免错误,为每个字段指定正确的dtypes:
np.array([tuple(lineitem)], dtype=Ticket_data.dtype)
请注意,我将lineitem
投射到元组 - 这是必要的,以便将lineitem
中的元素解释为单独的字段而不是单独的元素。结果是一个形状(1,)
(不是(1, 7)
):
np.array([tuple(lineitem)], dtype=Ticket_data.dtype).shape
# (1,)
如果我没有将lineitem
投射到元组,那么我会得到一个(1, 7)
数组,其中{em>个人元素位于{ {1}}被解释为lineitem
的序列,导致您在编辑中显示的废话。
然后可以将结果连接到'str,datetime64[m],datetime64[m],str,str,str,str'
。
顺便说一句,我强烈建议使用pandas而不是结构化数组来处理异构数据,例如此。