【问题标题】:generate random dates within a range in numpy在numpy的范围内生成随机日期
【发布时间】:2017-04-21 17:32:16
【问题描述】:

如何在numpy 中每两个月生成一个日期范围内的随机日期?我能想到的一种方法是生成两组随机整数数组:

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

然后我可以使用上述两个数组中每个月的“日”值生成日期。但是,这将要求我明确传递月份和年份数据。一种解决方案是首先生成所需的date_range,然后将范围内的“天”替换为上述数组值。但对于大型阵列,这可能不是最好的解决方案。此方法需要对范围内的每个元素进行操作。

我将不胜感激有关如何在numpy 中更有效地执行此操作的任何指示。

【问题讨论】:

  • 如果您希望每天都有相同的概率,使用 timedelta 是一个更好的主意。

标签: python arrays datetime pandas numpy


【解决方案1】:

如果您将开始日期定义为每月的第一天,然后添加随机时间增量会怎样?

例如

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)) )

【讨论】:

    【解决方案2】:

    这是一个纯 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))
    

    【讨论】:

      【解决方案3】:

      您可以先验地创建日期范围,例如使用pandasdate_range,并将其转换为numpy 数组。然后,使用numpy.random.choice 从这个日期数组中随机选择。

      【讨论】:

        【解决方案4】:

        有一种更简单的方法可以实现这一点,无需显式调用 numpy 之外的任何库。

        Numpy 有一个非常强大的 datetime 数据类型:特别是在这种情况下,您可以添加和减去整数,并将其视为可用的最小时间单位。例如,对于 %Y-%m-%d 格式:

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

        但是,对于 %Y-%m-%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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-10
          • 2018-11-06
          • 1970-01-01
          • 2013-12-02
          • 2019-04-02
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          相关资源
          最近更新 更多