Пока вы не ответите на мой вопрос о data.dtype
, я собираюсь добавить запятые и составить data
список кортежей:
In [117]: data = [(2019, 4, 21, 4.9, -16.5447, -177.1961, 22.4, 'US'),
...: (2019, 4, 21, 4.8, -9.5526, 109.6003, 10. , 'UK'),
...: (2019, 4, 21, 4.6, -7.2737, 124.0192, 554.9, 'FR')]
In [118]: arr_date = np.zeros((len(data),1), dtype='datetime64[D]')
...:
...: i = 0
...:
...: while i < len(data):
...: date = dt.date(data [i][0], data[i][1], data[i][2])
...: arr_date[i][0] = date
...: i += 1
...:
In [119]: arr_date
Out[119]:
array([['2019-04-21'],
['2019-04-21'],
['2019-04-21']], dtype='datetime64[D]')
То есть arr_date
- это массив (3,1) с datetime64[D]
dtype.
===
Я предполагаю, что ваш data
на самом деле является структурированным массивом с составным типом d. Например:
In [121]: data1 = np.array(data, dtype='i,i,i,f,f,f,f,U2')
In [122]: data1
Out[122]:
array([(2019, 4, 21, 4.9, -16.5447, -177.1961, 22.4, 'US'),
(2019, 4, 21, 4.8, -9.5526, 109.6003, 10. , 'UK'),
(2019, 4, 21, 4.6, -7.2737, 124.0192, 554.9, 'FR')],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2')])
In [123]: data1.shape
Out[123]: (3,)
In [124]: data1.dtype
Out[124]: dtype([('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2')])
Ваша итерация date
работает с этим. Но поля (не столбцы) data1
могут быть доступны по имени:
In [127]: data1['f0']
Out[127]: array([2019, 2019, 2019], dtype=int32)
column_stack
может объединить массив (3,) с (3,1) для получения (3,2), но:
In [130]: np.column_stack((data, arr_date))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-130-5c8e6a103474> in <module>
----> 1 np.column_stack((data, arr_date))
/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py in column_stack(tup)
638 arr = array(arr, copy=False, subok=True, ndmin=2).T
639 arrays.append(arr)
--> 640 return _nx.concatenate(arrays, 1)
TypeError: invalid type promotion
Первое замечание, что ошибка возникает при попытке сделать concatenate
. Бьюсь об заклад, все другие случайные попытки дали аналогичную ошибку (если они прошли ошибку оси). Ошибка говорит нам, что он не может объединить составной dtype, как в Out[124]
, с datetime64
dtype arr_date
. dtypes
не совпадают и не могут быть сопоставлены.
По сути, это не проблема конкатенации. Вы не пытаетесь добавить «столбец» в 2d массив или даже не пытаетесь создать 2d массив. data
не 2d. Это 1d. Что вам нужно сделать, это добавить поле в структурированный массив.
Имеется модуль функций, упрощающий работу со структурированными массивами.
In [131]: import numpy.lib.recfunctions as rf
append_fields
должен сделать трюк, но это может быть немного сложно использовать:
In [137]: rf.append_fields(data1, 'date', arr_date.ravel(), usemask=False)
Out[137]:
array([(2019, 4, 21, 4.9, -16.5447, -177.1961, 22.4, 'US', '2019-04-21'),
(2019, 4, 21, 4.8, -9.5526, 109.6003, 10. , 'UK', '2019-04-21'),
(2019, 4, 21, 4.6, -7.2737, 124.0192, 554.9, 'FR', '2019-04-21')],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2'), ('date', '<M8[D]')])
Это все еще одномерный массив, но с еще одним полем, которое я назвал date
.
===
В моем ответе:
Добавить и получить доступ к полю типа объекта для простого структурного массива
Я показываю, как построить новый структурированный массив с полями из двух массивов, что дает представление о том, что делает append_fields
.