[Python] 用 strptime() 將時間字串轉成 time.struct_time 物件
今天有個工作,要從一堆 log 裡面找出一些資料,
想想很麻煩,寫個 python 程式來讀 log 比較快…
不過因為需要每行 log 的時間,所以要讀入以下 log 最前面的時間資料:
2016-03-31 05:37:14,623 [DEBUG] Added task 16976 2016-03-31 05:37:15,177 [ INFO] Set proxy to 172.1.1.1
嗯… 用正規表示法將時間的部分抓出來是沒有問題的:
REGEX_LOG_TIME = re.compile("^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),(\d{3}) ") matched = REGEX_LOG_TIME.match(line)
但要怎麼把它轉成 python 看的懂的時間值呢?
找了一下,原來 python 的 time 模組裡,有個 strptime() 可以用,
只要依據時間字串的格式,指定正確的格式化字串,就可以幫忙解析了:
>>> time.strptime("2016-03-31 05:37:14", "%Y-%m-%d %H:%M:%S") time.struct_time(tm_year=2016, tm_mon=3, tm_mday=31, tm_hour=5, tm_min=37, tm_sec=14, tm_wday=3, tm_yday=91, tm_isdst=-1)
不過 strptime() 裡的秒數精度只到整數,逗號後面的三位小數是沒辦法讀的…
只好用正規表示法將最後面三位小數另外讀取出來,
並且用 time.mktime() 先將剛剛用 strptime() 轉出來的 time.struct_time 物件轉成一個整數值,
再將它加上後面的三位小數:
REGEX_LOG_TIME = re.compile("^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),(\d{3}) ") matched = REGEX_LOG_TIME.match(line) log_time = time.mktime(time.strptime(matched.group(1), "%Y-%m-%d %H:%M:%S")) + int(matched.group(2))/1000.0
有了這個 log_time 之後,想要計算特定 log 行的差距時間就很容易囉~^^
(本頁面已被瀏覽過 1,083 次)