需求
- 数据处理
- 数据获取
目的
我门有的时候想做一个脚本或者服务,一般来说都是实时来滑时间窗的,那就有个问题,到不能滑的时候应该有个等待机制,并且固定输出格式,这样时间全是全量的时间,不会出现重合和缺失的时间窗口部分,如果用于数据获取,也会全量获取。
我这里写的一个类的功能大概是
比如我此时时间是 2021年11点22分12秒,那我就取2021年11点22分这个整时间,之后如果设置second_size=4,则取2021.11.21.56-2021.11.22为第一个时间窗口(start_time, end_time)
之后开始更新,endtime=endtime+second_size, 如果这个时间在目前获取的实时时间之前,那就直接更新时间窗口的开始喝结束时间,如果在之后,说明目前时间窗口已经赶上当前的时间戳了,那就等一下,之后不停的更新目前的时间,直到目前的时间已经在这个窗口的结束时间之后了,跳出while开始更新窗口时间。
code
import datetime
import time
class TimerWindowFetch():
def __init__(self, second_size):
self.start_service_time_rough = datetime.datetime.now()
self.start_service_time = datetime.datetime(self.start_service_time_rough.year,
self.start_service_time_rough.month,
self.start_service_time_rough.day,
self.start_service_time_rough.hour,
self.start_service_time_rough.minute)
self.start_time = 0
self.second_size = second_size
self.window_size = datetime.timedelta(seconds=second_size)
self.end_time = 0
self.end_window_datetime = self.start_service_time
self.start_window_datetime = self.start_service_time - self.window_size
self.now_datetime = self.start_service_time_rough
def __get_end_time__(self):
self.end_time = int(self.end_window_datetime.timestamp())
return self.end_time
def __get_start_time__(self):
self.start_time = int(self.start_window_datetime.timestamp())
return self.start_time
def __calculate_windows__(self):
end_window_datetime_update = self.end_window_datetime + self.window_size
if end_window_datetime_update.timestamp() > self.now_datetime.timestamp():
self.now_datetime = datetime.datetime.now()
while end_window_datetime_update.timestamp() > self.now_datetime.timestamp():
self.now_datetime = datetime.datetime.now()
time.sleep(self.second_size)
self.start_window_datetime = self.end_window_datetime
self.end_window_datetime = end_window_datetime_update
def __get_start_end_time__(self):
self.__calculate_windows__()
return self.__get_start_time__(), self.__get_end_time__()
if __name__ == '__main__':
fetch_timewindow = TimerWindowFetch(4)
while(1):
print(fetch_timewindow.__get_start_end_time__())