[Python--]用Python实现时间离散化

最近在分析日志的时候遇到这样一个需求。统计每小时的角色创建总数和每10分钟的在线人数。需求具体实现不做讨论, 这里主要记录如何将日志时间离散到相应区间的问题。先解释每小时的概念,按24小时算,一天可以分这么几个时间点:00:00:00,01:00:00,02:00:00,...,23:00:00。那么在[N小时0分1秒,N+1小时0分0秒](注意是闭区间),这段时间是要划分到N+1小时的, 即, 从12:00:01开始到13:00:00结束这段时间归并13:00:00,特别的,23:00:01至次日00:00:00是属于次日的00:00:00。


【方案1】时间取到小时, 分钟和秒全部用0代替,这样造成的问题是区间划分不正确,[00:00:00,00:59:59]被划分到时间点00:00:00上,与需求方的意思相违背(这里真的要吐槽一下, 代码开始之前一定要做好需求分析, 大部分的统计结果不合适都是因为需求分析没有做好而导致的);

【方案2】通过判断分钟和秒是否为0,对hour进行操作,如果都为0,hour=N;如果不为0,hour=N+1。这里的问题在于,在23点时并不能单纯的做加1操作; 

【Final】使用datetime模块中的timedelta, 不用判断分钟和秒是否为0,也不用判断是不是在23点,代码如下:



def time_to_interval(dt, minutesdelta):
    """ minutesdelta measured in minutes
        dt is time str like '%Y-%m-%d %H:%M:%S'
    """
    try:
        date, time = dt.split()
        year, month, day = date.split('-')
        hour, minute, second = time.split(':')
        hour, minute, second = int(hour), int(minute), int(second)
        seconds = minute * 60 + second
        secondsdelta = minutesdelta * 60
        delta = math.ceil(seconds/secondsdelta)*secondsdelta - seconds
        return datetime(int(year), int(month), int(day), hour, minute, second)\
            + timedelta(seconds = delta)
    except Exception, ex:
        logger.error("%s" %  traceback.format_exc())
        return None

PS:函数里面有关时间字符串转换成datetime类型,python其实有专门的时间处理模块datetime,没有用的原因是因为,在日志比较多的情况下进行实时在线分析会导致时间性能的降低,至于如何分析及为什么会这样将在下一篇博文中记录。


Python 模块功能还是非常强大的, 只有你想不到。



阅读更多
换一批

没有更多推荐了,返回首页