【问题标题】:Generate random list of timestamps in python在python中生成随机时间戳列表
【发布时间】:2018-10-14 09:14:23
【问题描述】:

我正在尝试生成 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

【问题讨论】:

    标签: python random time timedelta


    【解决方案1】:

    datetime 库的全部要点:datetimetimedelta 等对象的行为尽可能与数字相似,因此您可以对它们进行算术运算。

    所以,要生成一天内的均匀分布,只需取从 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 小时。 timedelta 不明白这一点。

    【讨论】:

    • 我收到td = random.random() * datetime.timedelta(days=1) TypeError: unsupported operand type(s) for *: 'float' and 'datetime.timedelta'
    【解决方案2】:

    根据您的需要,学习 Python 日期时间和时间模块可能是值得的。如果您的代码将执行许多不同的操作,请使用@abarnert 的答案。如果你只需要一个时间字符串(而不是 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
    

    【讨论】:

      【解决方案3】:

      如果您需要连续时间:

      from datetime import datetime,timedelta
      
      time_starter = datetime.strptime("12:00:00","%H:%M:%S")
      
      for i in range(1,10):
          time = time_starter + timedelta(hours=i)
          time = time.strftime("%H:%M:%S")
      
          print(time)
      

      如果您需要随机或连续分钟使用:

      time = time_starter + timedelta(minutes=i) #continuous 
      time = time_starter + timedelta(minutes=randint(0,60)) #random
      

      【讨论】:

        【解决方案4】:
        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 个示例日期的列表 :)
        祝你好运

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-16
          • 2019-04-05
          • 2014-12-31
          • 1970-01-01
          • 2017-04-26
          • 1970-01-01
          • 1970-01-01
          • 2017-07-13
          相关资源
          最近更新 更多