生成numpy范围内的随机日期

时间:2016-12-06 22:34:36

标签: python arrays datetime pandas numpy

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

Numpy的日期时间数据类型非常强大:特别是对于这种情况,您可以添加和减去整数,并将其视为可用的最小时间单位。例如,对于%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)

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果您将开始日期定义为该月的第一个,然后添加随机时间值?

,该怎么办?

e.g。

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

答案 3 :(得分:0)

这是一个纯粹的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))
相关问题