向数据模拟器添加时间戳

时间:2016-06-21 17:43:55

标签: python datetime

我正在使用Python TestData模拟时间序列数据,并尝试添加一个新的键值(event_time),其中包含生成记录时的时间戳。问题是该字段在脚本运行时没有递增,只是在第一次执行时。有一种简单的方法可以做到这一点吗?

import testdata
import datetime


EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
class EventsFactory(testdata.DictFactory):
    event_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=0))
    start_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
    end_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
    event_code = testdata.RandomSelection(EVENT_TYPES)

for event in EventsFactory().generate(100):
    print event

输出:

{'start_time': datetime.datetime(2016, 6, 21, 17, 47, 50, 422020), 'event_code': 'USER_CONNECTED', 'event_time': datetime.datetime(2016, 6, 21, 17, 47, 50, 422006), 'end_time': datetime.datetime(2016, 6, 21, 18, 7, 50, 422020)}
{'start_time': datetime.datetime(2016, 6, 21, 17, 59, 50, 422020), 'event_code': 'USER_CONNECTED', 'event_time': datetime.datetime(2016, 6, 21, 17, 47, 50, 422006), 'end_time': datetime.datetime(2016, 6, 21, 18, 19, 50, 422020)}
{'start_time': datetime.datetime(2016, 6, 21, 18, 11, 50, 422020), 'event_code': 'USER_LOGOUT', 'event_time': datetime.datetime(2016, 6, 21, 17, 47, 50, 422006), 'end_time': datetime.datetime(2016, 6, 21, 18, 31, 50, 422020)}

2 个答案:

答案 0 :(得分:1)

所以timedelta()是您希望事件发生的未来。请注意,timedelta(minutes=12)导致生成的每个start_time之间的时间与for循环的前一次迭代中的datetime.datetime.now()相差12分钟(不是脚本的执行)。同样,end_time是相对timedelta(minutes=20)start_time,所以它始终在start_time前20分钟。您的event_time没有递增,因为它在代码运行的任何时间都没有增量(更改)值,并且在脚本运行时它将始终使用datetime.datetime.now()

如果是测试数据,我认为你会找到像

这样的东西
import testdata
import datetime


    EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
    class EventsFactory(testdata.DictFactory):
        start_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
        event_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=10))
        end_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
        event_code = testdata.RandomSelection(EVENT_TYPES)

    for event in EventsFactory().generate(100):
        print event

修改:如果不与提供的数据有关:

因此,您传入的testdata.DictFactory只会根据您创建的实例变量创建一个字典。

你想要一个event_time实例变量来获取for循环每次迭代的时间,这样做会是这样的:

import testdata
import datetime


    EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
    class EventsFactory(testdata.DictFactory):
        start_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
        end_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
        event_time = datetime.datetime.now()
        event_code = testdata.RandomSelection(EVENT_TYPES)

    for event in EventsFactory().generate(100):
        print event

如果我理解你想要的是什么,这应该在输出中实现。

编辑2

再看一遍之后,这可能达不到您想要的效果,因为EventsFactory().generate(100)似乎同时实例化所有100个,并且要获得event_time的字典键,您将拥有使用testdata.RelativeToDatetimeField()方法更改时间

答案 1 :(得分:0)

for event in EventsFactory().generate(10):
event["event_time"] = datetime.datetime.now()
print event