2016-07-15 4 views
2

У меня есть массив дат, как:Python: Добавление час вектор на сегодняшний день вектор поэлементно

>>> dates 
array([datetime.datetime(2013, 1, 1, 0, 0), 
     datetime.datetime(2013, 1, 2, 0, 0), 
     datetime.datetime(2013, 2, 1, 0, 0))], dtype=object) 

У меня есть соответствующий массив часов того же размера, как даты:

numpy.asarray([3,5,2]) 

Я хочу, чтобы генерировать следующее:

>>> datesPlusHour 
array([datetime.datetime(2013, 1, 1, 3, 0), 
     datetime.datetime(2013, 1, 2, 5, 0), 
     datetime.datetime(2013, 2, 1, 2, 0))], dtype=object) 

ie добавить час векторный к вектору векторный элемент мудрым. Я надеюсь использовать что-то лучше, чем цикл for.

ответ

1

Все, что вам нужно, это создание timedelta с от ваших часов, как Numpy массив монашествующих добавить его с датами:

>>> import datetime 
>>> import numpy as np 
>>> dates = np.array([datetime.datetime(2013, 1, 1, 0, 0), 
...  datetime.datetime(2013, 1, 2, 0, 0), 
...  datetime.datetime(2013, 2, 1, 0, 0)], dtype=object) 
>>> 
>>> h = np.asarray([3,5,2]) 
>>> hours = np.array([datetime.timedelta(hours=i) for i in h]) 
>>> 
>>> dates + hours 
array([datetime.datetime(2013, 1, 1, 3, 0), 
     datetime.datetime(2013, 1, 2, 5, 0), 
     datetime.datetime(2013, 2, 1, 2, 0)], dtype=object) 

Или как более Numpythonic подход можно использовать np.vectorize для того, чтобы применить функцию к вашему элементов массива вместо использования понимания списка.

>>> f = np.vectorize(lambda x: datetime.timedelta(hours=x)) 
>>> f(h) + dates 
array([datetime.datetime(2013, 1, 1, 3, 0), 
     datetime.datetime(2013, 1, 2, 5, 0), 
     datetime.datetime(2013, 2, 1, 2, 0)], dtype=object) 
Смежные вопросы