【随笔】写一个时间戳滑窗的类-可以输出开始时间和结束时间,并且等待机制到下一个可以滑窗的时间点再继续滑窗

该博客介绍了一个Python实现的定时器窗口类,用于实时滑动时间窗口并确保不遗漏或重叠时间片段。类中包含了时间窗口的初始化、更新、获取起止时间等功能,特别适用于数据获取场景,确保全量获取每个时间窗口的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

  1. 数据处理
  2. 数据获取

目的

我门有的时候想做一个脚本或者服务,一般来说都是实时来滑时间窗的,那就有个问题,到不能滑的时候应该有个等待机制,并且固定输出格式,这样时间全是全量的时间,不会出现重合和缺失的时间窗口部分,如果用于数据获取,也会全量获取。

我这里写的一个类的功能大概是

比如我此时时间是 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__())




结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值