Генерация случайного списка временных меток в python - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь сгенерировать случайный список 24-часовых отметок времени. Я могу сгенерировать один образец даты и времени между заданным диапазоном, используя код ниже. Я надеюсь создать несколько образцов (например, 10 образцов)

Кроме того, компонент даты не является для меня приоритетом. Если бы я мог отбросить это и просто генерировать случайные 24-часовые временные метки, это было бы хорошо.

Большинство найденных мной тем рассматривают только случайные даты генерации. Я могу найти все, что касается времени.

import random
import time
from datetime import datetime

def randomDate(start, end):
    frmt = '%d-%m-%Y %H:%M:%S'

    stime = time.mktime(time.strptime(start, frmt))
    etime = time.mktime(time.strptime(end, frmt))

    ptime = stime + random.random() * (etime - stime)
    dt = datetime.fromtimestamp(time.mktime(time.localtime(ptime)))
    return dt

random_datetime = randomDate("20-01-2018 13:30:00", "23-01-2018 04:50:34")

print(random_datetime)

Выход:

2018-01-21 03:33:55

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

В зависимости от ваших потребностей, возможно, стоит потрудиться изучить модули даты и времени Python. Если ваш код будет выполнять множество различных манипуляций, тогда ответьте на вопрос Абернерта. Если все, что вам нужно, это строка времени (а не временная метка Python), эта функция проверяет ее для вас:

import random

def randomTime():
    # generate random number scaled to number of seconds in a day
    # (24*60*60) = 86,400

    rtime = int(random.random()*86400)

    hours   = int(rtime/3600)
    minutes = int((rtime - hours*3600)/60)
    seconds = rtime - hours*3600 - minutes*60

    time_string = '%02d:%02d:%02d' % (hours, minutes, seconds)
    return time_string

for i in range(10):
    print(randomTime())

это выводит:

19:07:31
16:32:00
02:01:30
20:31:21
20:20:26
09:49:12
19:38:42
10:49:32
13:13:36
15:02:54

Но если вам не нужно 24-часовое время, вы можете перехватить переменную 'hours', прежде чем вставить ее в строку:

import random

def randomTime():
    # generate random number scaled to number of seconds in a day
    # (24*60*60) = 86,400

    rtime = int(random.random()*86400)

    hours   = int(rtime/3600)
    minutes = int((rtime - hours*3600)/60)
    seconds = rtime - hours*3600 - minutes*60

    # figure out AM or PM
    if hours >= 12:
        suffix = 'PM'
        if hours > 12:
            hours = hours - 12
    else:
        suffix = 'AM'

    time_string = '%02d:%02d:%02d' % (hours, minutes, seconds)
    time_string += ' ' + suffix
    return time_string

for i in range(10):
    print(randomTime())

, что дает:

05:11:45 PM
02:28:44 PM
08:09:19 PM
02:52:30 PM
07:40:02 PM
03:55:16 PM
03:48:44 AM
12:35:43 PM
01:32:51 PM
07:54:26 PM
0 голосов
/ 04 июля 2019
import random
import time
from datetime import datetime
dates = []
def randomDate(start, end):
    frmt = '%d-%m-%Y %H:%M:%S'

    stime = time.mktime(time.strptime(start, frmt))
    etime = time.mktime(time.strptime(end, frmt))

    ptime = stime + random.random() * (etime - stime)
    dt = datetime.fromtimestamp(time.mktime(time.localtime(ptime)))
    return dt

for i in range(0 , 10)
    dates.append(randomDate("20-01-2018 13:30:00", "23-01-2018 04:50:34"))

Ваши даты будут иметь список из 10 образцов даты :)
Удачи

0 голосов
/ 04 мая 2018

Весь смысл библиотеки datetime: datetime, timedelta и т. Д. Объекты ведут себя как можно более похожими на числа, так что вы можете просто выполнять арифметику с ними.

Итак, чтобы сгенерировать равномерное распределение за день, просто возьмите равномерное распределение от 0,0 до 1,0 и умножьте его на день: 1

td = random.random() * datetime.timedelta(days=1)

Чтобы сгенерировать равномерное случайное время в определенный день, просто добавьте его к полуночи этого дня:

dt = datetime.datetime(2018, 5, 1) + random.random() * datetime.timedelta(days=1)

Чтобы сгенерировать случайную метку времени между двумя метками времени:

dt = random.random() * (end - start) + start

А если вы хотите 10 из них:

[random.random() * (end - start) + start for _ in range(10)]

Это все, что нужно сделать. Держитесь подальше от всех других форматов времени из модуля time; они нужны только если вам нужна совместимость с такими вещами, как библиотеки C и данные файловой системы. Просто используйте datetime в первую очередь:

def randomtimes(stime, etime, n):
    frmt = '%d-%m-%Y %H:%M:%S'
    stime = datetime.datetime.strptime(start, frmt)
    etime = datetime.datetime.strptime(end, frmt)
    td = etime - stime
    return [random.random() * td + stime for _ in range(n)]

1. Однако имейте в виду, что если вы имеете дело с местным, а не временем UTC, некоторые дни на самом деле имеют длину 23 или 25 часов из-за перехода на летнее время. A timedelta этого не понимает.

...