我创建了一个数组:
Ticket_data = np.empty((0,7),
dtype='str,datetime64[m],datetime64[m],str,str,str,str')
Run Code Online (Sandbox Code Playgroud)
我正在尝试附加数据:
lineitem = [str(data[0][0]), OpenDT, CloseDT, str(data[0][11]),
str(data[0][12]), str(data[0][13]), str(data[0][14])]
Run Code Online (Sandbox Code Playgroud)
凡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
Run Code Online (Sandbox Code Playgroud)
编辑:
print np.array([lineitem])
Run Code Online (Sandbox Code Playgroud)
产出
[['21539' '2015-06-30T10:46-0700' '2015-06-30T10:55-0700' 'Testtext'
'Testtext2' 'Testtext3' 'Testtext5']]
Run Code Online (Sandbox Code Playgroud)
和
print np.array([lineitem], dtype=Ticket_data.dtype)
Run Code Online (Sandbox Code Playgroud)
输出
[[('', 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, '', '', '', '')]]
Run Code Online (Sandbox Code Playgroud)
我能做些什么来解决这个问题?
ali*_*i_m 13
首先,结构化数组中的字段与常规 ndarray 中的维度不同。您希望您的Ticket_label数组是一维的,但是对于该维度中的每个行元素都包含7 个字段,例如:
Ticket_data = np.empty((0,),
dtype='str,datetime64[m],datetime64[m],str,str,str,str')
Run Code Online (Sandbox Code Playgroud)
现在为了连接lineitem到Ticket_data,它必须首先从嵌套列表隐式转换为数组。由于您没有dtype为每个字段指定单独的s,numpy 将其lineitem视为同构数组,并找到dtype每个元素可以安全提升到的公共元素。
例如:
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')
Run Code Online (Sandbox Code Playgroud)
在这个例子中,每个元素都被转换为一个 21 长的字符串。在dtype这个阵列的不匹配的Ticket_data,而且因为没有投没有安全的方式'|S21'给'np.datetime64[m]'你一个invalid type promotion错误。
您可以通过显式转换lineitem为数组来避免错误,为每个字段指定正确的 dtypes:
np.array([tuple(lineitem)], dtype=Ticket_data.dtype)
Run Code Online (Sandbox Code Playgroud)
请注意,我正在转换lineitem为元组 - 这是必要的,以便将元素lineitem解释为单独的字段而不是单独的元素。结果是一个形状数组(1,)(不是(1, 7)):
np.array([tuple(lineitem)], dtype=Ticket_data.dtype).shape
# (1,)
Run Code Online (Sandbox Code Playgroud)
如果我不投lineitem给一个元组,然后我得到一个(1, 7)数组,其中每个单独的元素lineitem被解释为顺序的'str,datetime64[m],datetime64[m],str,str,str,str',导致你在编辑显示无稽之谈。
然后可以将结果连接到Ticket_label。
顺便说一句,我强烈建议使用Pandas而不是结构化数组来处理诸如此类的异构数据。