2016-08-31 4 views
1

Ich habe einen Datumsbereich - sagen zwischen 1925-01-01 und 1992-01-01. Ich möchte eine Liste von x Datumsangaben zwischen diesem Bereich generieren, und diese x erzeugten Daten folgen einer 'normalen' (Glockenkurve - siehe Bild) Verteilung.Generieren Sie eine normale Verteilung von Daten innerhalb eines Bereichs

Es gibt viele viele Antworten auf Stackoverflow darüber mit ganzen Zahlen zu tun (numpy verwenden, scipy, usw.), aber ich kann nicht ein solides Beispiel mit Daten

enter image description here

+5

Konvertieren Sie Ihre Daten in Ticks oder Sekunden oder eine andere 1-d-Einheit (das ist eine sehr häufige Operation für Daten; es ist sogar die natürliche Form intern). Dann ist der Ort des normal-dist zum Beispiel das mittlere Element (in deiner neuen 1d-Form) und du musst nur die Varianz/Std anpassen. Später transformieren Sie die Samples zurück. – sascha

Antwort

2

Per @ sascha Kommentar finden eine Umwandlung von den Terminen auf einen Zeitwert hat den Zweck erfüllt:

#!/usr/bin/env python3 

import time 
import numpy 

_DATE_RANGE = ('1925-01-01', '1992-01-01') 
_DATE_FORMAT = '%Y-%m-%d' 
_EMPIRICAL_SCALE_RATIO = 0.15 
_DISTRIBUTION_SIZE = 1000 

def main(): 
    time_range = tuple(time.mktime(time.strptime(d, _DATE_FORMAT)) 
         for d in _DATE_RANGE) 
    distribution = numpy.random.normal(
     loc=(time_range[0] + time_range[1]) * 0.5, 
     scale=(time_range[1] - time_range[0]) * _EMPIRICAL_SCALE_RATIO, 
     size=_DISTRIBUTION_SIZE 
    ) 
    date_range = tuple(time.strftime(_DATE_FORMAT, time.localtime(t)) 
         for t in numpy.sort(distribution)) 
    print(date_range) 

if __name__ == '__main__': 
    main() 

Beachten Sie, dass anstelle die _EMPIRICAL_SCALE_RATIO, könnte man (sollte?) scipy.stats.truncnorm verwenden, um gener aß ein truncated normal distribution.

Verwandte Themen