2016-12-06 5 views
5

Wie kann ich zufällige Daten innerhalb einer Reihe von Daten alle zweimonatlich in numpy generieren? Eine Möglichkeit, die ich denken kann erzeugt zwei Sätze von Zufallszahl-Arrays:generieren zufällige Daten innerhalb eines Bereichs in numpy

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

Ich kann dann die Daten erzeugen, mit den ‚Tag‘ Werte aus den beiden oben genannten Arrays für jeden Monat. Dies erfordert jedoch, dass ich die Daten für Monat und Jahr explizit übergebe. Eine Lösung wäre, die gewünschte date_range zuerst zu generieren und die "Tage" in dem Bereich durch die obigen Array-Werte zu ersetzen. Bei einem großen Array ist dies jedoch möglicherweise nicht die beste Lösung. Diese Methode erfordert eine Operation für jedes einzelne Element des Bereichs.

Ich würde gerne alle Hinweise, wie man dies in numpy effizienter tun.

+0

Wenn Sie jeden Tag wollen die gleiche Wahrscheinlichkeit haben, mit Timedelta ist eine viel bessere Idee. –

Antwort

3

Es gibt einen viel einfacheren Weg, dies zu erreichen, ohne explizit Bibliotheken über numpy hinaus aufrufen zu müssen.

Numpy hat einen recht leistungsstarken Datentyp datetime: speziell für diesen Fall können Sie ganze Zahlen addieren und subtrahieren und behandeln sie wie die kleinste verfügbare Zeiteinheit. beispielsweise für die a% Y-% m-% d Format:

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

jedoch für ein% Y-% m-% d% H:% M:% S Format:

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

in diesem Fall, wie Sie nur Informationen bis zu einem Tag Auflösung haben, können Sie einfach wie folgt vor:

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) 

oder wenn Sie noch sauberer darüber sein wollte:

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 

und dann benutzen Sie einfach:

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

Was ist, wenn Sie ein Startdatum als erstes des Monats definieren und dann ein zufälliges Timedelta hinzufügen?

z.B.

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

Hier ist eine reine numpy-Implementierung, die zwei Arrays von Datumsangaben für jeden Monat des Jahres erstellt. Das erste Array hat zufällige Werte von der ersten Hälfte jedes Monats und das zweite Array von der zweiten Hälfte jedes Monats.

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

Sie könnten den Datumsbereich a priori erstellen, z. Verwenden Sie pandas 's date_range, und konvertieren Sie es in ein numpy Array. Dann treffen Sie zufällige Wahlen von diesem Datenfeld unter Verwendung numpy.random.choice.

Verwandte Themen