Python

pythonで時刻文字列をパースする3つの方法【備忘録】

More than 1 year has passed since last update.

やりたい事

テキストで書かれた時刻をpythonのdatetime型にパースする際の方法について備忘録を作っておきたい。

環境

  • Windows10 pro
  • anaconda navigator 1.6.2
  • Jupyter Notebook 5.0.0
  • python 3.6.1
  • Intel Core i7 4770 16GB

経緯

1.OpenWeatherMapのXML内に登場する日時が見たことない形式(自分だけ)かつ時刻がGMT(UTC)だった。
2.9時間足してあげる処理をしないと時差で日付が違う状態になってしまう事態に対応するのが大変。
3.あらかじめ用意されている型に入れて時差を追加で計算してあげるのが一番と考えた。

ちなみにXMLの中で登場する日付はこんな感じ。

2017-07-08T19:33:11

パースの方法を調べたらたくさんあったのでコードをまとめておく。

import time
from datetime import datetime
from dateutil.parser import parse

start = time.time()
date="2017-07-08T19:33:11" #パース対象の文字列
for i in range(100000): #parse()で10万回パースするループ
    dt1 = parse(date)
elapsed_time_for_parse = time.time() - start #parse()でパースした場合の経過時間を格納

start = time.time()
for i in range(100000): #strptime()で10万回パースするループ
    dt2 = datetime.strptime(date, '%Y-%m-%dT%H:%M:%S')
elapsed_time_for_strptime = time.time() - start #strptime()でパースした場合の経過時間を格納

start = time.time()   
for i in range(100000): #文字列切出で10万回パースするループ
    dt3 = datetime(
        year=int(date[0:4]),month=int(date[5:7]),day=int(date[8:10]),
        hour=int(date[11:13]),minute=int(date[14:16]),second=int(date[17:20])
    )
elapsed_time_for_cutparse = time.time() - start #文字列切出でパースした場合の経過時間を格納

print('parse()       takes {:.4f}sec, dt1:{}'.format(elapsed_time_for_parse,dt1))
print('strptime()    takes {:.4f}sec, dt2:{}'.format(elapsed_time_for_strptime,dt2))
print('cut and parse takes {:.4f}sec, dt3:{}'.format(elapsed_time_for_cutparse,dt3))

結果

方法 所要時間
parse() 5.8433
strptime() 1.0622
文字列切出 0.2875

※所要時間は筆者の上記環境で10万回ループを実行した時間

まとめ

parse()が一発で楽だけど遅い
文字列切出が手間多いが速い。

参考にさせていただいたサイト

OpenWeatherMap
コード7区 日時の文字列を python でパース。年月や時分を取りだす
miyalog Python の datetime.strptime がすんごく遅い件

jupyter notebookの結果画面

image.png