当前位置:  开发笔记 > 编程语言 > 正文

在两个其他日期之间生成随机日期

如何解决《在两个其他日期之间生成随机日期》经验,为你挑选了7个好方法。

我如何生成一个必须在两个其他给定日期之间的随机日期?

函数的签名应该是这样的:

random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", 0.34)
                   ^                       ^          ^

            date generated has  date generated has  a random number
            to be after this    to be before this

并会返回如下日期: 2/4/2008 7:20 PM



1> Tom Alsberg..:

将两个字符串转换为时间戳(以您选择的分辨率,例如毫秒,秒,小时,天等),从较晚的值中减去较早的值,将您的随机数乘以(假设它分布在该值中range [0, 1]),并再次添加较早的一个.将时间戳转换回日期字符串,您在该范围内有一个随机时间.

Python示例(输出几乎采用您指定的格式,而不是0填充 - 指责美国时间格式约定):

import random
import time

def str_time_prop(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 random_date(start, end, prop):
    return str_time_prop(start, end, '%m/%d/%Y %I:%M %p', prop)

print(random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", random.random()))



2> nosklo..:
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)

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

示例运行:

from datetime import datetime

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


@emyller:不,我正在使用`(delta.days*24*60*60)+ delta.seconds`,这会产生总秒数.`total_seconds()`方法在python 2.7中是新的,并且在我回答问题时在2009年不存在.如果你有python 2.7,你应该使用它,但代码工作正常.
在这种情况下使用`start`变量是完全正确的.我在代码中看到的唯一问题是使用结果`delta`中的`seconds`属性.这不会返回整个时间间隔内的总秒数; 相反,它只是"时间"组件的秒数(0到60之间); `timedelta`对象有一个`total_seconds`方法,应该使用它.

3> emyller..:

一个小版本.

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对象.如果你有字符串,那么转换相当容易.其他答案指出了一些方法.



4> Artur Barseg..:
更新的答案

使用Faker更简单.

安装

pip install faker

用法:

from faker import Faker
fake = Faker()

fake.date_between(start_date='today', end_date='+30y')
# datetime.date(2025, 3, 12)

fake.date_time_between(start_date='-30y', end_date='now')
# datetime.datetime(2007, 2, 28, 11, 28, 16)

# Or if you need a more specific date boundaries, provide the start 
# and end dates explicitly.
import datetime
start_date = datetime.date(year=2015, month=1, day=1)
fake.date_between(start_date=start_date, end_date='+30y')
老答案

使用雷达非常简单

安装

pip install radar

用法

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


upvote建议faker模块..我用来生成配置文件,但没有使用日期实用程序faker是一个非常好的模块测试时.

5> amchugh89..:

这是一种不同的方法 - 那种作品..

from random import randint
import datetime

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

更好的方法

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



6> Pieter Bos..:

由于Python 3 timedelta支持乘法浮点数,所以现在你可以这样做:

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

鉴于start并且end属于这种类型datetime.datetime.例如,要在第二天生成随机日期时间:

import random
from datetime import datetime, timedelta

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



7> metakermit..:

为了插入基于熊猫的解决方案,我使用:

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/datetime对象.

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

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有