2013-12-17 3 views
2

Я новичок в Python Я пытаюсь создать генератор случайных времен, который генерирует случайное время от заданной переменной инициализации и заканчивается на заданной конечной переменной для 1000 записей и должен сохранять эти 1000 записей в базе данных.Случайное генерирование времени

До сих пор я достиг этого кода.

SQL.py

from sqlalchemy import create_engine, Column, Integer 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('sqlite:///sql.sqlite') 
Base = declarative_base() 
Session = sessionmaker(bind=engine) 

session = Session() 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    time = Column(Integer, default=None, index=True) 

Base.metadata.create_all(engine) 

Random.py

import datetime 
import time 
import random 


MINTIME = datetime.datetime(2010,8,6,8,14,59) 
MAXTIME = datetime.datetime(2013,8,6,8,14,59) 
RECORDS = 1000 

for RECORD in range(RECORDS): 
    RANDOMTIME = random.randint(MINTIME, MAXTIME) 
    print RANDOMTIME 

Она производит отслеживающий как этот

TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'int' 

Что я делаю не так, и, если это возможно предложить некоторые рефакторинга метод.

ответ

3

В принципе, вопрос: random.randint expects integers. Таким образом, вы должны дать ему целые числа, и преобразовать его обратно в DateTime, как вам требуется

Там может быть более эффективным способом, но вот один подход:

import datetime 
import time 

MINTIME = datetime.datetime(2010,8,6,8,14,59) 
MAXTIME = datetime.datetime(2013,8,6,8,14,59) 

mintime_ts = int(time.mktime(MINTIME.timetuple())) 
maxtime_ts = int(time.mktime(MAXTIME.timetuple())) 

for RECORD in range(RECORDS): 
    random_ts = random.randint(mintime_ts, maxtime_ts) 
    RANDOMTIME = datetime.datetime.fromtimestamp(random_ts) 
    print RANDOMTIME 
+0

Высокий. Работали как обаяние. благодаря – ajkumar25

1

Проблема заключается в том:

RANDOMTIME = random.randint(MINTIME, MAXTIME) 

randint ожидает два целых числа, вы обеспечиваете две даты.

вы можете сделать следующее, учитывая время одно и то же для MINTIME и MAXTIME:

for RECORD in range(RECORDS): 
    n = random.randint(0,(MAXTIME-MINTIME).days) 
    RANDOMTIME = MINTIME + datetime.deltatime(n) 
+0

Хорошо, как исправить это? 'RANDOMTIME = random.randint (интермедиат (MINTIME), Int (MAXTIME))' производит 'Ошибка типа: Int() аргумент должен быть строкой или числом, а не«datetime.datetime'' – ajkumar25

1

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

from datetime import datetime, timedelta 
from random import randint 

MINTIME = datetime(2010,8,6,8,14,59) 
MAXTIME = datetime(2013,8,6,8,14,59) 

PERIOD = (MAXTIME-MINTIME).total_seconds() 
for n in range(1000): 
    dt = MINTIME + timedelta(seconds=randint(0, PERIOD)) 
    # 2012-12-10 18:34:23 
    # etc... 
Смежные вопросы