[Python] 用 strptime() 將時間字串轉成 time.struct_time 物件

[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,058 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料