他の2つの日付の間にある必要があるランダムな日付をどのように生成しますか?
関数の署名は次のようになります。
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
両方の文字列をタイムスタンプに変換し(選択した解像度、たとえばミリ秒、秒、時間、日など)、後の文字列から前の文字列を減算し、乱数を掛けます(range [0, 1]
)その違いを使用して、以前のものに再度追加します。タイムスタンプを日付文字列に戻すと、その範囲にランダムな時間があります。
Pythonの例(出力はほぼ指定した形式で、0
padding-アメリカの時間形式の規則のせい):
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()))
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)
精度は秒です。必要に応じて、マイクロ秒まで精度を上げることも、たとえば30分まで下げることもできます。そのためには、最後の行の計算を変更するだけです。
実行例:
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
小さなバージョン。
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())),
)
start
とend
の両方の引数はdatetime
オブジェクトでなければなりません。代わりに文字列がある場合、変換するのはかなり簡単です。他の答えはそうするいくつかの方法を指します。
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()
これは別のアプローチです-その種の作品..
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))
Python 3 timedelta
はfloatとの乗算をサポートしているので、次のことができます。
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()
私が使用するパンダベースのソリューションをチップインするには:
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)
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))
この質問の本文ではなく、タイトルの文字通りの意味に対する回答を次に示します。
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)
このコードは、受け入れられた回答に大まかに基づいています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Create random datetime object."""
from datetime import datetime
import random
def create_random_datetime(from_date, to_date, Rand_type='uniform'):
"""
Create random date within timeframe.
Parameters
----------
from_date : datetime object
to_date : datetime object
Rand_type : {'uniform'}
Examples
--------
>>> random.seed(28041990)
>>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
datetime.datetime(1998, 12, 13, 23, 38, 0, 121628)
>>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
datetime.datetime(2000, 3, 19, 19, 24, 31, 193940)
"""
delta = to_date - from_date
if Rand_type == 'uniform':
Rand = random.random()
else:
raise NotImplementedError('Unknown random mode \'{}\''
.format(Rand_type))
return from_date + Rand * delta
if __== '__main__':
import doctest
doctest.testmod()
これは、任意の解像度でランダムな日付の配列を返す、エミラーのアプローチから修正されたソリューションです
import numpy as np
def random_dates(start, end, size=1, resolution='s'):
"""
Returns an array of random dates in the interval [start, end]. Valid
resolution arguments are numpy date/time units, as documented at:
https://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html
"""
start, end = np.datetime64(start), np.datetime64(end)
delta = (end-start).astype('timedelta64[{}]'.format(resolution))
delta_mat = np.random.randint(0, delta.astype('int'), size)
return start + delta_mat.astype('timedelta64[{}]'.format(resolution))
このアプローチの素晴らしい点の1つは、np.datetime64
は、日付への強制に非常に優れているため、開始/終了日を文字列、日付時刻、pandasタイムスタンプ...として指定できます。ほとんど何でも機能します。
別のものを追加するだけです:
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を使用すると、安全なサイトにいます。
日付と数値を変換するための多くのアルゴリズムは、多くのオペレーティングシステムですでに利用可能です。
乱数は何のために必要ですか?通常(言語に応じて)日付からエポックから秒/ミリ秒の数を取得できます。したがって、startDateとendDateの間のランダムな日付については、次のことができます。
これを行う最も簡単な方法は、両方の数値をタイムスタンプに変換し、これらを乱数ジェネレーターの最小および最大境界として設定することです。
簡単な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('Y-m-d H:i:s', $val);
}
_
この関数は、strtotime()
を使用して日時の説明をUnixタイムスタンプに変換し、date()
を使用して、生成されたランダムなタイムスタンプから有効な日付を作成します。
Mouvicielの答えに基づいて、numpyを使用したベクトル化されたソリューションを以下に示します。開始日と終了日をintに変換し、それらの間に乱数の配列を生成し、配列全体を日付に戻します。
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
パンダ+ numpyソリューション
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は、秒単位のタイムスタンプの差(浮動)です。次に、開始タイムスタンプに追加される0とdtsの間のpandas timedeltaを作成するために使用されます。
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
)
概念的には非常に簡単です。使用している言語に応じて、それらの日付を参照32または64ビット整数に変換できます。通常は、エポック(1970年1月1日)からの秒数または「Unix時間」または他の任意の日付からのミリ秒を表します。これらの2つの値の間にランダムな32または64ビット整数を生成するだけです。これは、どの言語でも1つのライナーである必要があります。
一部のプラットフォームでは、時刻をdoubleとして生成できます(日付は整数部、時刻は小数部の1つの実装です)。同じ原則が適用されますが、単精度または倍精度の浮動小数点数(Cの「floats」または「doubles」、Javaおよび他の言語)を処理します。差を減算し、ランダムに乗算します。番号(0 <= r <= 1)、開始時間に追加して完了します。
これは、ランダムと時間を使用して別のプロジェクト用に作成しました。 strftime()の最初の引数については、ドキュメンテーション here を表示できる時点から一般的な形式を使用しました。 2番目の部分はrandom.randrange関数です。引数間の整数を返します。希望する文字列に一致する範囲に変更します。 2番目の引数のTupleにはNice引数が必要です。
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))
ApacheCommonUtilsを使用して、指定された範囲内でランダムなlongを生成し、そのlongからDateを作成します。
例:
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()));
}
@(Tom Alsberg)の変更されたメソッドです。ミリ秒の日付を取得するように変更しました。
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
start_timestamp = time.mktime(time.strptime('Jun 1 2010 01:33:00', '%b %d %Y %I:%M:%S'))
end_timestamp = time.mktime(time.strptime('Jun 1 2017 12:33:00', '%b %d %Y %I:%M:%S'))
time.strftime('%b %d %Y %I:%M:%S',time.localtime(randrange(start_timestamp,end_timestamp)))
日付をタイムスタンプに変換し、random.randint
をタイムスタンプで呼び出してから、ランダムに生成されたタイムスタンプを日付に変換します。
from datetime import datetime
import random
def random_date(first_date, second_date):
first_timestamp = int(first_date.timestamp())
second_timestamp = int(second_date.timestamp())
random_timestamp = random.randint(
min(first_timestamp, second_timestamp), max(first_timestamp, second_timestamp)
)
return datetime.fromtimestamp(random_timestamp)
次に、このように使用できます
from datetime import datetime
d1 = datetime.strptime("1/1/2018 1:30 PM", "%m/%d/%Y %I:%M %p")
d2 = datetime.strptime("1/1/2019 4:50 AM", "%m/%d/%Y %I:%M %p")
random_date(d1, d2)
random_date(d2, d1) # works the same
タイムゾーンが気になる場合は、faker
ライブラリ、 このコードを盗んだ場所 を使用する必要があります。別の答えがすでに示しているとおりです。