Как я могу привести список словарей Python, содержащий строки даты, в массив массивов записей объектов datetime? - PullRequest
0 голосов
/ 07 ноября 2019

Этот вопрос касается построения массива пустых записей из списка словарей (как в другом вопросе), но специально для dtime типа datetime. Метод, изложенный там, не работает для меня. Читайте дальше -

У меня есть список словарей Python 3, например:

e = [{"date":"2019-11-07","value":3.147},{"date":"2019-11-08","value":2.7315}]

Я хочу преобразовать e в numpy массив / структуру записи,и приведение строки даты к объекту datetime или np.datetime64 одним махом.

Но следующее не работает: поле даты либо является строкой, а не объектом datetime- или бросает ValueError Could not convert object to NumPy datetime.

import numpy as np
what_goes_here = 'datetime64[s]' # or 'M8[D]', or..?
e_type = np.dtype([('date', what_goes_here), ('value', float)])
i = np.array(e, dtype=e_type)

Есть ли способ достичь всего этого за один шаг и если да, то как?

Пожалуйста, не Python 2 или Pandas.

Это обратное преобразование в Эффективный способ преобразования массива пустых записей в список словаря - плюс добавленная datetime сложность

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Получите значение и сохраните в виде списка кортежей перед приведением dtype к datetime64 и np.float

import numpy as np
e = [{"date": "2019-11-07", "value": 3.147},
     {"date": "2019-11-08", "value": 2.7315}]
e = [(d["date"], d["value"]) for d in e]
e = np.rec.array(e, dtype=[('date', 'datetime64[s]'), ('value', np.float)])
print('result: ', e)
print('data type of date: ', type(e.date[0]))

# print result
result:  [('2019-11-07T00:00:00', 3.147 ) ('2019-11-08T00:00:00', 2.7315)]
data type of date:  <class 'numpy.datetime64'>
0 голосов
/ 07 ноября 2019

Согласно этому ответу , преобразование объектов datetime в numpy изменилось в 1.11.

Используя часть вопроса по этой ссылке, это должно дать то, что вы ищете (с явно указанным типом даты и времени):

import numpy as np

e = [{"date":"2019-11-07","value":3.147},{"date":"2019-11-08","value":2.7315}]
e_type = np.dtype([('date', 'datetime64[us]'), ('value', np.float)])

records = np.array([(x['date'], x['value']) for x in e],
                   dtype=e_type)

# Produces
array([('2019-11-07T00:00:00.000000', 3.147 ),
       ('2019-11-08T00:00:00.000000', 2.7315)],
      dtype=[('date', '<M8[us]'), ('value', '<f8')])

>>> records[0][0]
numpy.datetime64('2019-11-07T00:00:00.000000')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...