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

093gszye  于 2024-01-08  发布在  其他
关注(0)|答案(5)|浏览(162)

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

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

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

uxh89sit

uxh89sit1#

有一种更简单的方法来实现这一点,而不需要显式调用numpy之外的任何库。
Numpy有一个非常强大的datetime数据类型:特别是在这种情况下,你可以添加和减去整数,它将其视为可用的最小时间单位。例如,对于%Y-%m-%d格式:

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

字符串
但是,对于%Y-%m-%d %H:%M:%S格式:

  1. exampledatetime2 = np.datetime64('2017-01-01 00:00:00')
  2. exampledatetime2 + 1
  3. >>
  4. 2017-01-01 00:00:01


在这种情况下,由于您只有最小到一天分辨率的信息,因此您可以简单地执行以下操作:

  1. import numpy as np
  2. bimonthly_days = np.arange(0, 60)
  3. base_date = np.datetime64('2017-01-01')
  4. random_date = base_date + np.random.choice(bimonthly_days)


或者你想更清楚地说

  1. import numpy as np
  2. def random_date_generator(start_date, range_in_days):
  3. days_to_add = np.arange(0, range_in_days)
  4. random_date = np.datetime64(start_date) + np.random.choice(days_to_add)
  5. return random_date


然后就用途:

  1. yourdate = random_date_generator('2012-01-15', 60)

展开查看全部
slhcrj9b

slhcrj9b2#

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

5t7ly7z5

5t7ly7z53#

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

  1. import datetime
  2. d0 = datetime.datetime.strptime('01/01/2016', '%d/%m/%Y')
  3. from calendar import monthrange
  4. max_day = monthrange(d0.year, d0.month)[1]
  5. import numpy as np
  6. random_dates_1 = []
  7. random_dates_2 = []
  8. for i in range(10):
  9. random_dates_1.append( d0 + datetime.timedelta(days=np.random.randint(0, int(max_day/2))) )
  10. random_dates_2.append( d0 + datetime.timedelta(days=np.random.randint(int(max_day/2), max_day+1)) )

字符串

展开查看全部
fnvucqvd

fnvucqvd4#

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

  1. import datetime
  2. from calendar import monthrange
  3. import numpy as np
  4. arr_first = np.array([])
  5. arr_second = np.array([])
  6. for i in range(1, 13):
  7. base = datetime.datetime(2016, i, 1)
  8. max_days = monthrange(2016, i)[1]
  9. first = np.random.randint(0, max_days // 2)
  10. second =np.random.randint(max_days // 2, max_days)
  11. arr_first = np.append(arr_first, base + datetime.timedelta(days=first))
  12. arr_second = np.append(arr_second, base + datetime.timedelta(days=second))

字符串

展开查看全部
xoefb8l8

xoefb8l85#

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

  1. import numpy as np
  2. def random_dates(start, range_in_days, count):
  3. """
  4. Generate a number of random dates in Datetime format.
  5. :param start: Start date. Must be string or Datetime object.
  6. :param range_in_days: Number of days past the start (exclusive). Must be an int.
  7. :param count: Number of values to generate
  8. :return: An ndarray of length count and dtype datetime64, full of random dates.
  9. """
  10. start = np.datetime64(start)
  11. base = np.full(count, start)
  12. offset = np.random.randint(0, range_in_days, count)
  13. offset = offset.astype('timedelta64[D]')
  14. return base + offset
  15. # prints 30 random dates within the month of January 2023
  16. print(random_dates("2023-01-01", 31, 10))

字符串

展开查看全部

相关问题