在numpy中的范围内生成随机日期

093gszye  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(123)

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

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

字符串
然后,我可以生成日期,每个月的'day'值来自上述两个数组。然而,这需要我显式传递月份和年份数据。解决方案是首先生成所需的date_range,并将范围中的'days'替换为上述数组值。但对于大型数组,这可能不是最好的解决方案。2这种方法需要对范围中的每个元素进行操作。
我将感谢任何关于如何在numpy中更有效地做到这一点的指针。

uxh89sit

uxh89sit1#

有一种更简单的方法来实现这一点,而不需要显式调用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)

slhcrj9b

slhcrj9b2#

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

5t7ly7z5

5t7ly7z53#

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

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

字符串

fnvucqvd

fnvucqvd4#

下面是一个纯numpy实现,它为一年中的每个月创建了两个datetime数组。第一个数组包含每个月上半月的随机值,第二个数组包含每个月下半月的随机值。

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

字符串

xoefb8l8

xoefb8l85#

所有已经给出的答案都涉及到一次生成多个日期时的某种循环。下面是一个完全并行化的函数,它使用与@Alex相同的基本方法,但完全没有迭代或追加。
这段代码不是通过添加已知的起始值来逐个构建数组,而是通过创建起始值数组和随机偏移量数组,然后将它们相加。

import numpy as np

def random_dates(start, range_in_days, count):
    """
    Generate a number of random dates in Datetime format.
    :param start: Start date. Must be string or Datetime object.
    :param range_in_days: Number of days past the start (exclusive). Must be an int.
    :param count: Number of values to generate
    :return: An ndarray of length count and dtype datetime64, full of random dates.
    """
    start = np.datetime64(start)
    base = np.full(count, start)
    offset = np.random.randint(0, range_in_days, count)
    offset = offset.astype('timedelta64[D]')
    return base + offset

# prints 30 random dates within the month of January 2023
print(random_dates("2023-01-01", 31, 10))

字符串

相关问题