Потеря типа данных при конвертации numpy .ndarry.tolist? - PullRequest
1 голос
/ 19 февраля 2020

Итак, у меня есть ndarray, похожий на этот пример:

dates = ['3/1/2020','4/15/2020','7/21/2020']
darray = np.asarray([dateutil.parser.parse(d) for d in dates], dtype='datetime64[ns]')

>>> array(['2020-03-01T00:00:00.000000000', '2020-04-15T00:00:00.000000000',
   '2020-07-21T00:00:00.000000000'], dtype='datetime64[ns]') 

darray.tolist()

>>> [1583020800000000000, 1586908800000000000, 1595289600000000000]

Итак, я предполагаю, что он конвертируется в число наносекунд с момента возникновения POSIX (1970-01-01). Есть ли способ избежать этой потери типа данных?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Это то, что вы ищете?

>>> list(darray)
[numpy.datetime64('2020-03-01T00:00:00.000000000'),
 numpy.datetime64('2020-04-15T00:00:00.000000000'),
 numpy.datetime64('2020-07-21T00:00:00.000000000')]

Разница в том, что np.ndarray.tolist() преобразует значения в типы Python, тогда как list(...) оставляет объекты такими, какие они есть. Внутренне, конечно, оба они содержат 64-битные целые числа в любом случае. Если вы хотите преобразовать в Python объекты даты и времени, посмотрите на этот вопрос . К сожалению, это не так удобно, как могло бы быть.

1 голос
/ 19 февраля 2020

Обычно tolist лучше, чем list. Он работает все время вниз и быстрее. list просто перебирает первое измерение. Но преобразование в нативные типы Python зависит от типа dtype. В этом случае единицы времени имеют значение.

In [559]: arr = np.array(['2020-03-01T00:00:00.000000000', '2020-04-15T00:00:00.000000000', 
     ...:    '2020-07-21T00:00:00.000000000'], dtype='datetime64[ns]')                         
In [560]: arr.shape                                                                            
Out[560]: (3,)
In [561]: arr.dtype                                                                            
Out[561]: dtype('<M8[ns]')

list является эквивалентом [x for x in arr], итерация по первому измерению:

In [562]: list(arr)                                                                            
Out[562]: 
[numpy.datetime64('2020-03-01T00:00:00.000000000'),
 numpy.datetime64('2020-04-15T00:00:00.000000000'),
 numpy.datetime64('2020-07-21T00:00:00.000000000')]

tolist преобразует его до Python объектов - до конца:

In [563]: arr.tolist()                                                                         
Out[563]: [1583020800000000000, 1586908800000000000, 1595289600000000000]

В то время как ns дает целое число, другие единицы времени дают разные результаты:

In [564]: arr.astype('datetime64[D]')                                                          
Out[564]: array(['2020-03-01', '2020-04-15', '2020-07-21'], dtype='datetime64[D]')
In [565]: arr.astype('datetime64[D]').tolist()                                                 
Out[565]: 
[datetime.date(2020, 3, 1),
 datetime.date(2020, 4, 15),
 datetime.date(2020, 7, 21)]

In [566]: arr.astype('datetime64[s]').tolist()                                                 
Out[566]: 
[datetime.datetime(2020, 3, 1, 0, 0),
 datetime.datetime(2020, 4, 15, 0, 0),
 datetime.datetime(2020, 7, 21, 0, 0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...