Увеличение массива даты и времени без использования цикла for - PullRequest
0 голосов
/ 04 января 2019

У меня есть массив Numpy, который имеет длинный список datetime.Мне было интересно, есть ли способ добавить год ко всем значениям массива сразу, без использования цикла for?например.Используете какой-нибудь модуль NumPy или DateTime?

>>> import datetime
>>> import numpy as np

>>> dts.shape
(64580,)

>>> dts[:5]
array([datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
       datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
       datetime.date(2000, 1, 15)], dtype=object)

>>> new_dts = somemodule.somefunctionforaddingyearorsomething(dts, year=1)
>>> new_dts
array([datetime.date(2001, 1, 15), datetime.date(2001, 1, 15),
       datetime.date(2001, 1, 15), datetime.date(2001, 1, 15),
       datetime.date(2001, 1, 15)], dtype=object)

Примечание: День каждой даты всегда установлен на 15-й день, поскольку даты представляют среднемесячные данные.

У меня естьреализовал это с помощью цикла for, однако это может быть медленным в вычислительном отношении ..

Код для этого здесь:

def add_year_to_Datelist(dl):

dts = dl.dates.copy()
for idx, date in enumerate(dts):
    dts[idx] = date.replace(year=date.year + 1)

dl.set_dates(dts)
return dl

Cheers

Ответы [ 2 ]

0 голосов
/ 04 января 2019

NumPy не поддерживает «1 год» в качестве временной шкалы, поскольку это может быть 365 или 366 дней.Если вы желаете использовать Pandas, вы можете использовать pd.to_datetime с pd.DateOffset, что поддерживает смещения по годам:

import datetime, numpy as np, pandas as pd

dts = np.array([datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
                datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
                datetime.date(2000, 1, 15)], dtype=object)

dts = (pd.to_datetime(dts) + pd.DateOffset(years=1)).values.astype('datetime64[D]')

# array(['2001-01-15', '2001-01-15', '2001-01-15', '2001-01-15',
#        '2001-01-15'], dtype='datetime64[D]')

С NumPy вы можете добавить фиксированное количество дней после преобразования массива object dtype в np.datetime64:

dts = dts.astype(np.datetime64) + np.timedelta64(365, 'D')

# array(['2001-01-14', '2001-01-14', '2001-01-14', '2001-01-14',
#        '2001-01-14'], dtype='datetime64[D]')

Обратите внимание на 1-день несоответствия между двумя результатами.

0 голосов
/ 04 января 2019

Делать вещи быстрее, используя цикл for, довольно сложно.Использование map, тем не менее, переносит вычисления в C и может значительно ускорить процесс.

Попробуйте это:

def add_year(dl, add=1):
    """Return new list with year increased by specified amount."""
    dts = list(map(lambda date: date.replace(year = date.year + add), dl.dates.copy()))
    return dts

Не уверен, как получить список пустых, потому что я не работал спока что он тупой (я знаю, жалкий ...), но вы знаете, так что да

...