概要
とあるものをスクレイピングしてて,経過タイム的なのの処理に困ったのでメモ.
こういうストップウォッチの表記知ってますか?
「x'yy"z」 は「x分yy.z秒」ということになります.この文字列(str型)からpythonを使って秒(float型)に変換したいというのが今回やりたいことです.
例えば
「1'45"5」 -> 105.5秒という変換です.
1. Datetimeのstrptimeを使って文字列をdatetime型に変換
プログラム中では,pythonの文字列型は'hoge'
または"hoge"
で記述されますが,今回のタイム表記「x'yy"z」は文字列中に「'」,「"」が含まれてしまいます.こういった場合は,pythonの文字列では\
を使って対応し,'x\'yy"z'
という表記になります.
これをstrptimeを使ってdatetime型にすると次のようになります.
from datetime import datetime
# %Mは分,%Sは秒,%fはマイクロ秒
strtime = '1\'45"5' # 文字列
t = datetime.strptime(strtime, '%M\'%S"%f')
print('t:', t)
print('type:', type(t))
# Output
# t: 1900-01-01 00:01:45.500000
# type: <class 'datetime.datetime'>
これだけだと,datetimeは日付型なので,1900年1月1日0時1分45秒500000マイクロ秒ということになってしまいます.
今回は日付ではなく,「タイム」として扱いたいので,これだけでは不十分です.
そこで,timedelta型へ変換します.
2. timedelta型へ変換,更に秒への変換
timedeltaは日付や時間の足し引きに使われたりするように,「日付」ではなく「時間」を表します.しかし文字列から直接の変換ができないためdatetime型を返しました.
datetime型からtimedelta型への変換は次のとおりです.
from datetime import timedelta
t_delta = timedelta(
seconds=t.second, # datetime型tの秒が格納されている
microseconds=t.microsecond, # datetime型tのマイクロ秒が格納されている
minutes=t.minute, # datetime型tの分が格納されている
)
print('t_delta:', t_delta)
print('type:', type(t_delta))
# Output
# t_delta: 0:01:45.500000
# type: <class 'datetime.timedelta'>
timedelta型では日付ではなくなり,時間としての1分45秒5として扱われていることがわかります.
最後に1分45秒5を秒のみに変換します.
もちろん,手動でプログラミング書いてもいいですが,timedeltaではtotal_seconds()
というメソッドがあり,一発で秒への変換が可能です!
tdl2sec = t_delta.total_seconds()
print(tdl2sec)
print(type(tdl2sec))
#Output
# 105.5
# <class 'float'>
めでたく目標達成!!