【问题标题】:Generate a normal distribution of dates within a range生成范围内日期的正态分布
【发布时间】:2017-01-08 16:39:09
【问题描述】:

我有一个日期范围 - 比如说在 1925-01-011992-01-01 之间。我想在该范围内生成 x 日期列表,并让生成的 x 日期遵循“正常”(钟形曲线 - 见图)分布。

stackoverflow 上有很多关于使用整数执行此操作的答案(使用 numpyscipy 等),但我找不到带日期的可靠示例

【问题讨论】:

  • 将您的日期转换为刻度或秒或其他一些一维单位(这是日期的一种非常常见的操作;它甚至是内部的自然形式)。然后正常分布的位置例如是中间元素(在您的新一维形式中),您只需要调整方差/标准。稍后,您将样本转换回来。

标签: python date numpy gaussian normal-distribution


【解决方案1】:

根据@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()

请注意,您可以(应该?)使用scipy.stats.truncnorm 来生成truncated normal distribution,而不是_EMPIRICAL_SCALE_RATIO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2021-09-01
    • 1970-01-01
    • 2019-01-30
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多