2016-12-06 2 views
5

Как я могу генерировать случайные даты в диапазоне дат раз в два месяца в numpy? Один из способов я могу думать порождают два набора случайных целых массивов:генерировать случайные даты в диапазоне от numpy

bimonthly1 = np.random.randint(1,15,12) 
bimonthly2 = np.random.randint(16,30,12) 

Затем я могу генерировать даты, со значениями «дня» из вышеуказанных двух массивов для каждого месяца. Однако это потребует от меня явно передавать данные за месяц и год. Решением было бы сначала сгенерировать желаемый date_range и подставить «дни» в диапазоне с указанными выше значениями массива. Но для большого массива это может быть не лучшее решение. Этот метод требует операции для каждого элемента диапазона.

Я был бы признателен за любые указатели на то, как это сделать в numpy более эффективно.

+0

Если вы хотите, чтобы каждый день, чтобы иметь такую ​​же вероятность, используя timedelta гораздо лучшая идея. –

ответ

3

Существует намного более простой способ достичь этого, без необходимости явно обращаться к библиотекам за пределами numpy.

У Numpy есть тип данных datetime, который достаточно мощный: специально для этого случая вы можете добавлять и вычитать целые числа, и это относится к нему как к наименьшему доступному времени. например, для% Y-% m-% d Формат:

exampledatetime1 = np.datetime64('2017-01-01') 
exampledatetime1 + 1 
>> 
2017-01-02 

однако, для% Y-% m-% D% H:% M:% S Формат:

exampledatetime2 = np.datetime64('2017-01-01 00:00:00') 
exampledatetime2 + 1 
>> 
2017-01-01 00:00:01 

в этом случае, как и у вас есть только информацию вплоть до разрешения дня, вы можете просто сделать следующее:

import numpy as np 

bimonthly_days = np.arange(0, 60) 
base_date = np.datetime64('2017-01-01') 
random_date = base_date + np.random.choice(bimonthly_days) 

или если вы хотите быть еще чище об этом:

import numpy as np 

def random_date_generator(start_date, range_in_days): 
    days_to_add = np.arange(0, range_in_days) 
    random_date = np.datetime64(start_date) + np.random.choice(days_to_add) 
    return random_date 

, а затем просто использовать:

yourdate = random_date_generator('2012-01-15', 60) 
0

Что делать, если вы определили дату начала как первый месяц, а затем добавили случайный timedelta?

например.

import datetime 
d0 = datetime.datetime.strptime('01/01/2016', '%d/%m/%Y') 

from calendar import monthrange 
max_day = monthrange(d0.year, d0.month)[1] 

import numpy as np 
random_dates_1 = [] 
random_dates_2 = [] 
for i in range(10): 
    random_dates_1.append(d0 + datetime.timedelta(days=np.random.randint(0, int(max_day/2)))) 
    random_dates_2.append(d0 + datetime.timedelta(days=np.random.randint(int(max_day/2), max_day+1))) 
0

Это чистая реализация numpy, которая создает два массива данных за каждый месяц в году. Первый массив имеет случайные значения из первой половины каждого месяца, а второй - со второй половины каждого месяца.

import datetime 
from calendar import monthrange 
import numpy as np 

arr_first = np.array([]) 
arr_second = np.array([]) 

for i in range(1, 13): 
    base = datetime.datetime(2016, i, 1) 
    max_days = monthrange(2016, i)[1] 
    first = np.random.randint(0, max_days // 2) 
    second =np.random.randint(max_days // 2, max_days) 
    arr_first = np.append(arr_first, base + datetime.timedelta(days=first)) 
    arr_second = np.append(arr_second, base + datetime.timedelta(days=second)) 
2

Вы можете создать диапазон дат априори, например. используя pandasdate_range и преобразуйте его в массив numpy. Затем сделайте случайный выбор из этого массива дат, используя numpy.random.choice.

Смежные вопросы