Подтвердить что ты не робот

Как я могу создать многоуровневую переменную python для datetime

У меня есть некоторые входные данные со временными метками во входном файле в виде часов с даты, указанной в имени файла.

Это немного бесполезно, поэтому мне нужно преобразовать его в объекты python datetime.datetime, а затем поместить его в массив numpy. Я мог бы написать цикл for, но я хотел бы сделать что-то вроде:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))

который выдает TypeError.

Можно ли это сделать? Я застрял с python 2.6 и numpy 1.6.1.

4b9b3361

Ответ 1

Смотрите NumPy Datetimes и Timedeltas. В принципе, вы можете представлять datetimes в NumPy, используя тип numpy.datetime64, который позволяет вам делать диапазоны значений.

Для NumPy 1.6, который имеет гораздо менее полезный тип datetime64, вы можете использовать подходящее понимание списка для создания datetimes (см. также Создание диапазона дат в Python):

base = datetime.datetime(2000, 1, 1)
arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)])

Это создает

array([2000-01-01 00:00:00, 2000-01-01 01:00:00, 2000-01-01 02:00:00,
   2000-01-01 03:00:00, 2000-01-01 04:00:00, 2000-01-01 05:00:00,
   2000-01-01 06:00:00, 2000-01-01 07:00:00, 2000-01-01 08:00:00,
   2000-01-01 09:00:00, 2000-01-01 10:00:00, 2000-01-01 11:00:00,
   2000-01-01 12:00:00, 2000-01-01 13:00:00, 2000-01-01 14:00:00,
   2000-01-01 15:00:00, 2000-01-01 16:00:00, 2000-01-01 17:00:00,
   2000-01-01 18:00:00, 2000-01-01 19:00:00, 2000-01-01 20:00:00,
   2000-01-01 21:00:00, 2000-01-01 22:00:00, 2000-01-01 23:00:00], dtype=object)

Ответ 2

t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime)

Ключевым моментом здесь является использование astype(datetime), иначе результат будет datetime64.

Ответ 3

Обратите внимание, что решение @nneonneo можно упростить в

result = first_date + np.arange(24) * datetime.timedelta(hours=1)

благодаря манипуляциям с массивом NumPy. Массив result имеет тогда dtype=object.

Для более сложных диапазонов вам может быть интересен пакет scikits.timeseries (больше не поддерживается) или лучше,  pandas, в котором реализована большая часть идей scikits.timeseries. Оба пакета поддерживают более старые версии NumPy (1.5, 1.6...)

Ответ 4

Как отмечено в другом ответе, для Numpy > 1.7 вы можете использовать встроенную функцию времени и времени Numpy. Примеры в документации Numpy не включают в себя использование np.arange с шагами, поэтому здесь один:

timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')

Numpy устанавливает dtype этого результата в datetime64[h]. Вы можете установить это явно на меньшую единицу времени с помощью dtype='datetime64[m]'.

В версии 1.8.1 (и я ожидаю раньше) попытка добавления смещения к этому массиву результатов, который меньше часа, не будет иметь эффекта.

  • timearray += np.timedelta64(10,'s') не изменяется timearray
  • timearray2 = timearray + np.timedelta64(10,'s') добавит 10 секунд к timearray и преобразует dtype timearray2 в datetime64[s]

Ответ 5

С помощью современного NumPy вы можете сделать это:

np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08'))

И это дает вам:

array(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
       '2017-01-05', '2017-01-06', '2017-01-07'], dtype='datetime64[D]')