我正在使用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)}
答案 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