3

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

ランダム.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'

私が間違っていることと、可能であればリファクタリングされた方法を提案してください。

4

3 に答える 3

5

基本的に、問題は次のとおりrandom.randintです。したがって、整数を指定し、必要に応じて日時に変換する必要があります

もっと効率的な方法があるかもしれませんが、ここに 1 つのアプローチがあります。

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
于 2013-12-17T17:04:02.863 に答える
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...
于 2013-12-17T17:04:15.737 に答える
1

問題は:

RANDOMTIME = random.randint(MINTIME, MAXTIME)

randint は 2 つの整数を想定しているため、2 つの日付を指定しています。

MINTIME と MAXTIME の時間が同じであることを考慮して、次のことができます。

for RECORD in range(RECORDS):
    n = random.randint(0,(MAXTIME-MINTIME).days)
    RANDOMTIME = MINTIME + datetime.deltatime(n)
于 2013-12-17T17:01:16.507 に答える