2016-12-06 119 views
5

如何在兩個月的日期範圍內在numpy之間生成隨機日期?從上面的兩個數組每月在numpy範圍內生成隨機日期

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

我可以再生成日期,與「天」值:我能想到的一個方法是產生兩組隨機整數數組。但是,這需要我明確地傳遞月份和年份數據。解決辦法是首先生成所需的date_range,並用上面的數組值替換範圍內的'days'。但是對於大型陣列來說,這可能不是最好的解決方案。此方法將需要對範圍的每個元素進行操作。

我將不勝感激任何關於如何在numpy更有效地做到這一點的指針。

+0

如果你想每天有相同的概率,使用timedelta是一個更好的主意。 –

回答

3

有一個更簡單的方法來實現這一點,而不需要顯式調用numpy之外的任何庫。

Numpy的日期時間數據類型非常強大:特別是對於這種情況,您可以添加和減去整數,並將其視爲可用的最小時間單位。例如,對於%Y-%間 - %d格式:

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

然而,對於%Y-%間 - %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從這組日期中進行隨機選擇。