усечение части значений в массиве numpy - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу только первые 10 символов каждого значения в массиве.

Вот массив:

array(['2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-09-30T00:00:00.000000000']

Я хотел бы написать код, который даст мне это:

array(['2018-06-30','2018-06-30'   .... etc

Вот обновление: Мой код:

x = np.array(df4['per_end_date'])
x

вывод:

array(['2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-09-30T00:00:00.000000000',
   '2018-09-30T00:00:00.000000000', '2018-09-30T00:00:00.000000000', etc

Я хотел бы только первые 10 символов каждого значения в массиве. Следующий код дает мне ошибку IndexError: недопустимый индекс для скалярной переменной.

x = np.array([y[:9] for y in x])

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Хотя numpy не всегда лучший способ манипулирования строками, вы можете векторизовать эту операцию, и, как всегда, векторизованным функциям следует отдавать предпочтение перед итерацией.

Настройка

arr = np.array(['2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
   '2018-06-30T00:00:00.000000000', '2018-09-30T00:00:00.000000000'],
  dtype='<U29')

Использование np.frombuffer

np.frombuffer(
    arr.view((str, 1 )).reshape(arr.shape[0], -1)[:, :10].tostring(),
    dtype=(str,10)
)

array(['2018-06-30', '2018-06-30', '2018-06-30', '2018-06-30',
       '2018-06-30', '2018-06-30', '2018-06-30', '2018-09-30'],
      dtype='<U10')

Задержка

arr = np.repeat(arr, 10000)

%timeit np.array([y[:10] for y in arr])
48.6 ms ± 961 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
np.frombuffer(
    arr.view((str, 1 )).reshape(arr.shape[0], -1)[:, :10].tostring(),
    dtype=(str,10)
)

6.87 ms ± 311 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit np.array(arr,dtype= 'datetime64[D]')
44.9 ms ± 2.93 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
0 голосов
/ 16 сентября 2018

Хорошо, я понял это.

df4['per_end_date'].dtype

вывод:

dtype('<M8[ns]')

Итак, следующий код работал отлично.

x = np.array(df4['per_end_date'],dtype= 'datetime64[D]')
x

вывод:

array(['2018-06-30', '2018-06-30', '2018-06-30', '2018-06-30',
   '2018-06-30', '2018-06-30', '2018-06-30', '2018-09-30',
   '2018-09-30', '2018-09-30', '2018-09-30', '2018-09-30',
   '2018-09-30', '2018-09-30', '2018-09-30', '2018-09-30', etc

Отлично, когдаВы можете понять это.:)

0 голосов
/ 16 сентября 2018

Это довольно простая задача работы со списками в python

import numpy
x = numpy.array(['2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
           '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
           '2018-06-30T00:00:00.000000000', '2018-06-30T00:00:00.000000000',
           '2018-06-30T00:00:00.000000000', '2018-09-30T00:00:00.000000000'])
numpy.array([y[:10] for y in x])
# array(['2018-06-30', '2018-06-30', '2018-06-30', '2018-06-30',
#        '2018-06-30', '2018-09-30'], 
#        dtype='|S10')

Для получения дополнительной информации вы должны прочитать немного документации по спискам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...