สร้างวันที่สุ่มระหว่างวันอื่นสองวัน


144

ฉันจะสร้างวันที่สุ่มซึ่งต้องอยู่ระหว่างวันที่กำหนดอีกสองวันได้อย่างไร

ลายเซ็นของฟังก์ชันควรเป็นดังนี้:

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


วิธีการนำเสนอคำถามในขณะนี้ยังไม่ชัดเจนว่าคุณต้องการให้วันที่หรือเวลาเป็นแบบสุ่มหรือไม่ ตัวอย่างของคุณชี้ให้เห็นว่าคุณกำลังมองหาเวลา หากต้องอยู่ระหว่างวันที่สองวันคุณอาจต้องการแก้ไขคำตอบที่ให้มาเพื่อให้เหมาะกับความต้องการของคุณและไม่รวมเวลาสิ้นสุดและเวลาเริ่มต้น สุดท้ายในคำตอบส่วนใหญ่เช่นคำตอบที่ได้รับการยอมรับโค้ดจะแสดงวันที่และเวลาที่ไม่ จำกัด เวลาสิ้นสุดเนื่องจากการตัดทอนเป็น int ในการสร้างเวลาที่อาจมีจุดสิ้นสุดในคำตอบให้เปลี่ยนรหัสเป็นptime = stime + prop * (etime - stime) + 0.5
tortal

คำตอบ:


150

แปลงสตริงทั้งสองเป็นการประทับเวลา (ในความละเอียดที่คุณเลือกเช่นมิลลิวินาทีวินาทีวินาทีชั่วโมงวันอะไรก็ได้) ลบค่าก่อนหน้าจากภายหลังคูณจำนวนสุ่มของคุณ (สมมติว่ามีการกระจายใน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()))

วิธีนี้ไม่รองรับสำหรับวันที่เริ่มก่อนปี 1970
Cmbone

123
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

3
การใช้startตัวแปรในกรณีนั้นเหมาะสมอย่างยิ่ง ปัญหาเดียวที่ฉันเห็นในรหัสคือการใช้แอตทริบิวต์จากผลลัพธ์seconds deltaนั่นจะไม่ส่งคืนจำนวนวินาทีทั้งหมดในช่วงเวลาทั้งหมด แต่เป็นเพียงจำนวนวินาทีจากองค์ประกอบ 'เวลา' (ค่าระหว่าง 0 ถึง 60) timedeltaวัตถุมีtotal_secondsวิธีการที่ควรจะนำมาใช้แทน
emyller

7
@emyller: ไม่ฉันใช้(delta.days * 24 * 60 * 60) + delta.secondsผลลัพธ์ที่ได้ในวินาทีทั้งหมด total_seconds()วิธีการใหม่ในหลาม 2.7 และไม่ได้อยู่ในปี 2009 กลับเมื่อฉันตอบคำถาม หากคุณมี python 2.7 คุณควรใช้สิ่งนั้นแทน แต่โค้ดนั้นใช้งานได้ดีเหมือนเดิม
nosklo

ฉันไม่ทราบถึงการไม่มีอยู่ของวิธีนี้ใน 2.7- ฉันเพิ่งตรวจสอบว่าโดยทั่วไปแล้ววัตถุที่กำหนดเวลานั้นประกอบด้วยจำนวนวันและวินาทีดังนั้นคุณจึงถูกต้อง :-)
emyller

@emyller: เพียงแค่เพื่อความสมบูรณ์วัตถุ timedelta ประกอบด้วยวัน, วินาทีและ microseconds ความแม่นยำของรหัสสร้างวันที่แบบสุ่มข้างต้นไม่เกินวินาที แต่สามารถเปลี่ยนแปลงได้ดังที่ฉันได้กล่าวไว้ในคำตอบ
nosklo

85

รุ่นเล็ก ๆ

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วัตถุ หากคุณมีสตริงแทนการแปลงจะค่อนข้างง่าย คำตอบอื่น ๆ ชี้ให้เห็นถึงวิธีการบางอย่างในการทำเช่นนั้น


62

คำตอบที่อัปเดต

ง่ายยิ่งขึ้นโดยใช้Faker 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()

3
upvote สำหรับการแนะนำโมดูล faker .. ฉันใช้เพื่อสร้างโปรไฟล์ แต่ไม่ได้ใช้ยูทิลิตี้วันที่ faker เป็นโมดูลที่ดีมากในขณะทดสอบ
Gahan

ฉันได้รับการส่งออกในรูปแบบนี้แต่ผมอยากส่งออกเช่นนี้datetime.date(2039, 3, 16) 2039-03-16ต้องทำอย่างไร?
Ayush Kumar

คุณหมายถึงคุณต้องการสตริงหรือไม่? ง่ายมาก fake.date_between(start_date='today', end_date='+30y').strftime('%Y-%m-%d')(เพียงรูปแบบตามความเหมาะสม)
Artur Barseghyan

1
โหวตให้การใช้ห้องสมุดที่น่าทึ่งแม้ว่าคุณจะต้องติดตั้งก็ตาม ซึ่งจะช่วยลดความซับซ้อนของการใช้งานลงเหลือ 4 บรรทัด
Blairg23

1
@ KubiK888: แน่นอนดูคำตอบการอัปเดตของฉัน คุณควรระบุ start_date อย่างชัดเจน
Artur Barseghyan

23

นี่เป็นแนวทางที่แตกต่าง - ผลงานแบบนั้น ..

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

1
แนวทางแรกจะไม่เลือกวันที่สิ้นสุดในวันที่ 29, 30 หรือ 31 และแนวทางที่สองของคุณจะไม่คำนึงถึงปีอธิกสุรทินเมื่อปีนั้นคือ 366 วันกล่าวคือถ้าstartdate+1 ปีผ่านไปจนถึงวันที่ 31 ธันวาคมในปีอธิกสุรทินนี้ รหัสจะไม่เลือกวันที่เดียวกันในอีกหนึ่งปีต่อมา ทั้งสองวิธีให้คุณระบุวันที่เริ่มต้นและจำนวนปีในอนาคตเท่านั้นในขณะที่คำถามคือถามเกี่ยวกับการระบุวันที่สองวันและในความคิดของฉันนั่นเป็น API ที่มีประโยชน์มากกว่า
Boris

16

เนื่องจาก 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()

6

ในการชิปในโซลูชันที่ใช้หมีแพนด้าฉันใช้:

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)

ส่งผ่านวัตถุแพนด้า / วันที่และเวลาโดยตรง

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

และคุณจะสร้างซีรี่ส์วันที่และเวลาแบบสุ่มอย่างสวยงามได้อย่างไร (กล่าวคือโดยไม่ต้องวนซ้ำฟังก์ชันของคุณสำหรับแต่ละองค์ประกอบ)
dmvianna

อาจเป็นไปได้ที่จะแก้ไขฟังก์ชันเพื่อสร้างอาร์เรย์ของdeltaค่าและจับคู่ค่าทั้งหมดพร้อมกันเพื่อประทับเวลา ส่วนตัว pd.Series([5] * 10, [random_date('2014-01-01', '2014-01-30') for i in range(10)])แต่ผมต้องการที่จะทำบางสิ่งบางอย่างเช่น
metakermit

3

นี่คือคำตอบสำหรับความหมายตามตัวอักษรของชื่อเรื่องแทนที่จะเป็นเนื้อหาของคำถามนี้:

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)

รหัสนี้อ้างอิงจากคำตอบที่ยอมรับอย่างหลวม ๆ


คุณสามารถเปลี่ยนบรรทัดสุดท้ายที่สองให้ptime = random.randint(stime, etime)ถูกต้องมากขึ้นเล็กน้อยเนื่องจากrandintสร้างช่วงรวม
Boris

3

คุณสามารถใช้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
ไวยากรณ์มีการเปลี่ยนแปลงเล็กน้อยไม่แน่ใจว่าจะทำอย่างไรข้างต้น แต่วัตถุ django จะมีวันที่สุ่มเต็มดังนี้:client = mixer.blend(Client, date=mixer.RANDOM)
tutuDajuju

@tutuDajuju: ลูกค้ายืนอยู่เพื่ออะไร?
Nima Soroush

ตามเอกสารของพวกเขาอาจเป็นคลาสโมเดล Django, SQLAlchemy หรือ Mongoengine
tutuDajuju

2
#!/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 __name__ == '__main__':
    import doctest
    doctest.testmod()

2

แปลงวันที่ของคุณเป็นการประทับเวลาและเรียก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(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)  # ValueError because the first date comes after the second date

หากคุณสนใจเกี่ยวกับเขตเวลาคุณควรใช้date_time_between_datesจากFakerห้องสมุดที่ฉันขโมยรหัสนี้มาจากคำตอบอื่นที่แนะนำไปแล้ว


1
  1. แปลงวันที่ที่คุณป้อนเป็นตัวเลข (int, float, อะไรก็ได้ที่ดีที่สุดสำหรับการใช้งานของคุณ)
  2. เลือกตัวเลขระหว่างตัวเลขสองวันของคุณ
  3. แปลงตัวเลขนี้กลับเป็นวันที่

อัลกอริทึมจำนวนมากสำหรับการแปลงวันที่เป็นและจากตัวเลขมีอยู่แล้วในระบบปฏิบัติการจำนวนมาก


1

คุณต้องการหมายเลขสุ่มสำหรับอะไร? โดยปกติแล้ว (ขึ้นอยู่กับภาษา) คุณจะได้รับจำนวนวินาที / มิลลิวินาทีจากยุคจากวันที่ ดังนั้นสำหรับวันที่สุ่มระหว่าง startDate และ endDate คุณสามารถทำได้:

  1. คำนวณเวลาเป็นมิลลิวินาทีระหว่าง startDate และ endDate (endDate.toMilliseconds () - startDate.toMilliseconds ())
  2. สร้างตัวเลขระหว่าง 0 และตัวเลขที่คุณได้รับใน 1
  3. สร้างวันที่ใหม่ด้วยเวลาชดเชย = startDate.toMilliseconds () + ตัวเลขที่ได้รับใน 2

1

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการแปลงตัวเลขทั้งสองเป็นการประทับเวลาจากนั้นตั้งค่าเหล่านี้เป็นขอบเขตต่ำสุดและสูงสุดบนตัวสร้างตัวเลขสุ่ม

ตัวอย่าง 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()เพื่อกำหนดวันที่ที่ถูกต้องจากการประทับเวลาแบบสุ่มที่สร้างขึ้น


ถ้าใครสามารถเขียนใน python ได้จะเป็นประโยชน์
quilby

1

เพียงเพิ่มอีกอัน:

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 คุณอยู่ในไซต์ที่ปลอดภัย


1

นี่คือโซลูชันที่แก้ไขจากวิธีการของ emyller ซึ่งส่งคืนอาร์เรย์ของวันที่สุ่มตามความละเอียดใด ๆ

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

ส่วนหนึ่งของสิ่งที่ดีเกี่ยวกับแนวทางนี้np.datetime64คือการบังคับสิ่งต่าง ๆ ให้เข้ากับวันที่ได้ดีมากดังนั้นคุณสามารถระบุวันที่เริ่มต้น / สิ้นสุดของคุณเป็นสตริงวันที่เวลาการประทับเวลาของแพนด้า ... ทุกอย่างจะได้ผล


0

แนวคิดมันค่อนข้างง่าย คุณจะสามารถแปลงวันที่เหล่านั้นเป็นจำนวนเต็ม 32 หรือ 64 บิตอ้างอิงได้โดยขึ้นอยู่กับภาษาที่คุณใช้โดยทั่วไปจะแสดงจำนวนวินาทีตั้งแต่ยุค (1 มกราคม 1970) หรือที่เรียกว่า "เวลา Unix" หรือมิลลิวินาทีนับตั้งแต่วันที่อื่น ๆ เพียงแค่สร้างจำนวนเต็ม 32 หรือ 64 บิตแบบสุ่มระหว่างสองค่านั้น นี่ควรเป็นซับในภาษาใดก็ได้

ในบางแพลตฟอร์มคุณสามารถสร้างเวลาเป็นสองเท่าได้ (วันที่เป็นส่วนจำนวนเต็มเวลาเป็นส่วนเศษส่วนคือการนำไปใช้งานหนึ่ง) หลักการเดียวกันนี้ใช้ได้ยกเว้นว่าคุณกำลังจัดการกับตัวเลขทศนิยมตำแหน่งเดียวหรือสองเท่า ("ลอย" หรือ "คู่" ในภาษา C, Java และภาษาอื่น ๆ ) ลบผลต่างคูณด้วยตัวเลขสุ่ม (0 <= r <= 1) เพิ่มเวลาเริ่มต้นและทำเสร็จ


0

ในหลาม:

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

(ต้องการdateutilไลบรารีpython - pip install python-dateutil)


0

ใช้ ApacheCommonUtils เพื่อสร้าง long แบบสุ่มภายในช่วงที่กำหนดจากนั้นสร้าง Date จากระยะยาวนั้น

ตัวอย่าง:

นำเข้า org.apache.commons.math.random.RandomData;

นำเข้า org.apache.commons.math.random.RandomDataImpl;

สาธารณะ Date nextDate (วันที่ต่ำสุดวันที่สูงสุด) {

RandomData randomData = new RandomDataImpl();

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

}


1
คำถามถูกแท็ก "python"
David Marx

0

ฉันทำสิ่งนี้สำหรับโครงการอื่นโดยใช้การสุ่มและเวลา ฉันใช้รูปแบบทั่วไปในบางครั้งคุณสามารถดูเอกสารประกอบได้ที่นี่สำหรับอาร์กิวเมนต์แรกใน strftime () ส่วนที่สองคือฟังก์ชัน random.randrange ส่งคืนจำนวนเต็มระหว่างอาร์กิวเมนต์ เปลี่ยนเป็นช่วงที่ตรงกับสตริงที่คุณต้องการ คุณต้องมีข้อโต้แย้งที่ดีในทูเพิลของการระงับข้อที่สอง

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

0

แพนด้า + วิธีแก้ปัญหา

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 ซึ่งจะถูกเพิ่มลงในการประทับเวลาเริ่มต้น


0

จากคำตอบของ mouviciel นี่คือวิธีแก้ปัญหาแบบเวกเตอร์โดยใช้ numpy แปลงวันที่เริ่มต้นและวันที่สิ้นสุดเป็น ints สร้างอาร์เรย์ของตัวเลขสุ่มระหว่างพวกเขาและแปลงอาร์เรย์ทั้งหมดกลับเป็นวันที่

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

0

มันแก้ไขวิธีการของ @ (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


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

อ้างอิง


0
    # needed to create data for 1000 fictitious employees for testing code 
    # code relating to randomly assigning forenames, surnames, and genders
    # has been removed as not germaine to the question asked above but FYI
    # genders were randomly assigned, forenames/surnames were web scrapped,
    # there is no accounting for leap years, and the data stored in mySQL

    import random 
    from datetime import datetime
    from datetime import timedelta

    for employee in range(1000):
        # assign a random date of birth (employees are aged between sixteen and sixty five)
        dlt = random.randint(365*16, 365*65)
        dob = datetime.today() - timedelta(days=dlt)
        # assign a random date of hire sometime between sixteenth birthday and yesterday
        doh = datetime.today() - timedelta(days=random.randint(1, dlt-365*16))
        print("born {} hired {}".format(dob.strftime("%d-%m-%y"), doh.strftime("%d-%m-%y")))

0

ทางเลือกในการสร้างวันที่สุ่มระหว่างวันที่สองวันโดยใช้np.random.randint(), pd.Timestamp().valueและpd.to_datetime()ด้วยfor loop:

# Import libraries
import pandas as pd

# Initialize
start = '2020-01-01' # Specify start date
end = '2020-03-10' # Specify end date
n = 10 # Specify number of dates needed

# Get random dates
x = np.random.randint(pd.Timestamp(start).value, pd.Timestamp(end).value,n)
random_dates = [pd.to_datetime((i/10**9)/(60*60)/24, unit='D').strftime('%Y-%m-%d')  for i in x]

print(random_dates)

เอาต์พุต

['2020-01-06',
 '2020-03-08',
 '2020-01-23',
 '2020-02-03',
 '2020-01-30',
 '2020-01-05',
 '2020-02-16',
 '2020-03-08',
 '2020-02-09',
 '2020-01-04']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.