1. 程式人生 > >[Python--]用Python實現時間離散化

[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 模組功能還是非常強大的, 只有你想不到。