2016-08-31 2 views
1

У меня есть диапазон дат - от 1925-01-01 и 1992-01-01. Я хотел бы сгенерировать список из x дат между этим диапазоном и получить эти x сгенерированные даты, следуя распределению «нормальный» (колокольчик - см. Изображение).Создайте нормальное распределение дат в диапазоне

Есть много много ответов на StackOverflow о делать это с целыми числами (с использованием numpy, scipy и т.д.), но я не могу найти твердый пример с датами

enter image description here

+5

Преобразование даты в тики или секунды или некоторые другие единицы (это очень распространенная операция для дат, это даже естественная форма внутри). Тогда расположение нормального dist - это, например, средний элемент (в вашей новой форме 1d), и вам просто нужно настроить дисперсию/std. Позже вы снова преобразуете образцы. – sascha

ответ

2

В соответствии с @ Sascha своего комментария , преобразование из дат в значение времени делает работу:

#!/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() 

Обратите внимание, что вместо _EMPIRICAL_SCALE_RATIO, вы можете (должны?) использовать scipy.stats.truncnorm для Gener съел truncated normal distribution.