在两个其他date之间生成一个随机date

我怎么会产生一个随机的date必须在两个其他给定的date之间? 函数签名应该像这样 –

randomDate("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", 0.34) ^ ^ ^ date generated has date generated has random number to be after this to be before this 

并会返回一个date,如“2008年2月4日下午7点20分”

将这两个string转换为时间戳(以你select的分辨率,例如毫秒,秒,小时,天,等等),从后面减去前面的数字,把你的随机数(假设它分布在[0,1]不同之处,再加上前面的一个。 将时间戳转换回datestring,并在该范围内有一个随机时间。

Python的例子(输出几乎是你指定的格式,除了0填充 – 指责美国时间格式的约定):

 import random import time def strTimeProp(start, end, format, prop): """Get a time at a proportion of a range of two formatted times. start and end should be strings specifying times formated in the given format (strftime-style), giving an interval [start, end]. prop specifies how a proportion of the interval to be taken after start. The returned time will be in the specified format. """ stime = time.mktime(time.strptime(start, format)) etime = time.mktime(time.strptime(end, format)) ptime = stime + prop * (etime - stime) return time.strftime(format, time.localtime(ptime)) def randomDate(start, end, prop): return strTimeProp(start, end, '%m/%d/%Y %I:%M %p', prop) print randomDate("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", random.random()) 
 from random import randrange from datetime import timedelta def random_date(start, end): """ This function will return a random datetime between two datetime objects. """ delta = end - start int_delta = (delta.days * 24 * 60 * 60) + delta.seconds random_second = randrange(int_delta) return start + timedelta(seconds=random_second) 

精度是秒。 如果需要,可以将精度提高到微秒,或者减less到半小时。 为此只需更改最后一行计算。

示例运行:

 d1 = datetime.strptime('1/1/2008 1:30 PM', '%m/%d/%Y %I:%M %p') d2 = datetime.strptime('1/1/2009 4:50 AM', '%m/%d/%Y %I:%M %p') print random_date(d1, d2) 

输出:

 2008-12-04 01:50:17 

一个微小的版本。

 import datetime import random def random_date(start, end): """Generate a random datetime between `start` and `end`""" return start + datetime.timedelta( # Get a random amount of seconds between `start` and `end` seconds=random.randint(0, int((end - start).total_seconds())), ) 

请注意, startend参数都应该是datetime对象。 如果你有string,转换相当容易。 其他答案指出了一些方法来做到这一点。

使用雷达非常简单

安装

$ pip安装雷达

用法

 import datetime import radar # Generate random datetime (parsing dates from str values) radar.random_datetime(start='2000-05-24', stop='2013-05-24T23:59:59') # Generate random datetime from datetime.datetime values radar.random_datetime( start = datetime.datetime(year=2000, month=5, day=24), stop = datetime.datetime(year=2013, month=5, day=24) ) # Just render some random datetime. If no range is given, start defaults to # 1970-01-01 and stop defaults to datetime.datetime.now() radar.random_datetime() 

这是一个不同的方法 – 那种作品

 from random import randint import datetime date=datetime.date(randint(2005,2025), randint(1,12),randint(1,28)) 

WAIITT – 更好的方法

 startdate=datetime.date(YYYY,MM,DD) date=startdate+datetime.timedelta(randint(1,365)) 

为了在一个基于pandas的解决scheme芯片我使用:

 import pandas as pd import numpy as np def random_date(start, end, position=None): start, end = pd.Timestamp(start), pd.Timestamp(end) delta = (end - start).total_seconds() if position is None: offset = np.random.uniform(0., delta) else: offset = position * delta offset = pd.offsets.Second(offset) t = start + offset return t 

我喜欢它,因为它有很好的pd.Timestamp特性,可以让我在其中放置不同的东西和格式。 考虑以下几个例子

你的签名。

 >>> random_date(start="1/1/2008 1:30 PM", end="1/1/2009 4:50 AM", position=0.34) Timestamp('2008-05-04 21:06:48', tz=None) 

随机的位置。

 >>> random_date(start="1/1/2008 1:30 PM", end="1/1/2009 4:50 AM") Timestamp('2008-10-21 05:30:10', tz=None) 

不同的格式。

 >>> random_date('2008-01-01 13:30', '2009-01-01 4:50') Timestamp('2008-11-18 17:20:19', tz=None) 

直接传递pandas/date时间对象。

 >>> random_date(pd.datetime.now(), pd.datetime.now() + pd.offsets.Hour(3)) Timestamp('2014-03-06 14:51:16.035965', tz=None) 

这样做的最简单方法是将两个数字转换为时间戳,然后将其设置为随机数生成器上的最小和最大边界。

一个快速的PHP例子是:

 // Find a randomDate between $start_date and $end_date function randomDate($start_date, $end_date) { // Convert to timetamps $min = strtotime($start_date); $max = strtotime($end_date); // Generate random number using above bounds $val = rand($min, $max); // Convert back to desired date format return date('Ymd H:i:s', $val); } 

此函数使用strtotime()将date时间描述转换为Unix时间戳记,并使用date()从生成的随机时间戳记中生成有效date。

由于Python 3 timedelta支持与浮动乘法,所以现在你可以做:

 import random random_date = start + (end - start) * random.random() 

因为startend的types是datetime.datetime 。 例如,要在第二天内生成一个随机的date时间:

 import random from datetime import datetime, timedelta start = datetime.now() end = start + timedelta(days=1) random_date = start + (end - start) * random.random() 

这里是对标题的字面含义的回答,而不是这个问题的正文:

 import time import datetime import random def date_to_timestamp(d) : return int(time.mktime(d.timetuple())) def randomDate(start, end): """Get a random date between two dates""" stime = date_to_timestamp(start) etime = date_to_timestamp(end) ptime = stime + random.random() * (etime - stime) return datetime.date.fromtimestamp(ptime) 

这个代码是基于松散的接受的答案。

你可以使用Mixer

 pip install mixer 

和,

 from mixer import generators as gen print gen.get_datetime(min_datetime=(1900, 1, 1, 0, 0, 0), max_datetime=(2020, 12, 31, 23, 59, 59)) 
  1. 把你的inputdate转换成数字(int,float,最适合你的用法)
  2. 在两个date号码之间select一个数字。
  3. 将此号码转换回date。

在许多操作系统中,许多用于将数据转换为数字的algorithm已经可用。

你需要什么随机数? 通常(取决于语言),您可以从date获得从Epoch开始的秒/毫秒数。 所以对于startDate和endDate之间的随机date,你可以这样做:

  1. 计算startDate和endDate之间的时间(以毫秒为单位)(endDate.toMilliseconds() – startDate.toMilliseconds())
  2. 生成一个介于0和你在1中获得的数字之间的数字
  3. 生成一个新的date与时间偏移= startDate.toMilliseconds()+在2中获得的数字

只是添加另一个:

 datestring = datetime.datetime.strftime(datetime.datetime( \ random.randint(2000, 2015), \ random.randint(1, 12), \ random.randint(1, 28), \ random.randrange(23), \ random.randrange(59), \ random.randrange(59), \ random.randrange(1000000)), '%Y-%m-%d %H:%M:%S') 

日处理需要一些考虑。 随着28你在安全的网站。

从概念上讲,这很简单。 根据你使用的是哪种语言,你可以将这些date转换成32或64位整数的参考,通常代表自1970年1月1日以来的秒数,也就是其他任意date之后的“Unix时间”或毫秒。 只需在这两个值之间生成一个随机的32或64位整数。 这应该是任何语言的一个class轮。

在一些平台上,你可以生成一个双精度时间(date是整数部分,时间是小数部分是一个实现)。 除了处理单精度或双精度浮点数(C,Java和其他语言中的“浮点”或“双精度”)之外,同样的原理也适用。 减去差值,乘以随机数(0 <= r <= 1),加上开始时间并完成。

在python中:

 >>> from dateutil.rrule import rrule, DAILY >>> import datetime, random >>> random.choice( list( rrule(DAILY, dtstart=datetime.date(2009,8,21), until=datetime.date(2010,10,12)) ) ) datetime.datetime(2010, 2, 1, 0, 0) 

(需要python dateutil库 – pip install python-dateutil

使用ApacheCommonUtils在一个给定的范围内生成一个随机长度,然后在那个长度中创buildDate。

例:

import org.apache.commons.math.random.RandomData;

import org.apache.commons.math.random.RandomDataImpl;

public Date nextDate(Date min,Date max){

 RandomData randomData = new RandomDataImpl(); return new Date(randomData.nextLong(min.getTime(), max.getTime())); 

}

我使用随机和时间做了另一个项目。 我使用了一个通用格式,可以在这里查看strftime()中第一个参数的文档。 第二部分是一个random.randrange函数。 它在参数之间返回一个整数。 将其更改为与您想要的string匹配的范围。 你必须在第二个地狱的元组有很好的论点。

 import time import random def get_random_date(): return strftime("%Y-%m-%d %H:%M:%S",(random.randrange(2000,2016),random.randrange(1,12), random.randrange(1,28),random.randrange(1,24),random.randrange(1,60),random.randrange(1,60),random.randrange(1,7),random.randrange(0,366),1)) 

pandas+ numpy解决scheme

 import pandas as pd import numpy as np def RandomTimestamp(start, end): dts = (end - start).total_seconds() return start + pd.Timedelta(np.random.uniform(0, dts), 's') 

dts是以秒为单位的时间戳(float)之间的差异。 然后用它来创build一个介于0到dts之间的pandastimedelta,并将其添加到开始时间戳中。

根据mouviciel的回答,这是一个使用numpy的向量化解决scheme。 将开始和结束date转换为整数,在它们之间生成一个随机数组,并将整个数组转换回date。

 import time import datetime import numpy as np n_rows = 10 start_time = "01/12/2011" end_time = "05/08/2017" date2int = lambda s: time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple()) int2date = lambda s: datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S') start_time = date2int(start_time) end_time = date2int(end_time) random_ints = np.random.randint(low=start_time, high=end_time, size=(n_rows,1)) random_dates = np.apply_along_axis(int2date, 1, random_ints).reshape(n_rows,1) print random_dates 

这是@(Tom Alsberg)的修改方法。 我修改它以毫秒为单位获取date。

 import random import time import datetime def random_date(start_time_string, end_time_string, format_string, random_number): """ Get a time at a proportion of a range of two formatted times. start and end should be strings specifying times formated in the given format (strftime-style), giving an interval [start, end]. prop specifies how a proportion of the interval to be taken after start. The returned time will be in the specified format. """ dt_start = datetime.datetime.strptime(start_time_string, format_string) dt_end = datetime.datetime.strptime(end_time_string, format_string) start_time = time.mktime(dt_start.timetuple()) + dt_start.microsecond / 1000000.0 end_time = time.mktime(dt_end.timetuple()) + dt_end.microsecond / 1000000.0 random_time = start_time + random_number * (end_time - start_time) return datetime.datetime.fromtimestamp(random_time).strftime(format_string) 

例:

 print TestData.TestData.random_date("2000/01/01 00:00:00.000000", "2049/12/31 23:59:59.999999", '%Y/%m/%d %H:%M:%S.%f', random.random()) 

产出: 2028/07/08 12:34:49.977963