제목과 같은 상황이 필요해서 찾아봤지만 pandas.Timedelta() 를 제외하고는 찾아보기 힘들었습니다. pandas 모듈을 쓰지 않으면 수동으로 파싱하는 루틴을 만들어야 했습니다.
그래서 편하게(?) 이용할 수 있는 방법을 찾고 또 테스트했습니다.
import pandas
import datetime
def str_to_timedelta(delta: str = None):
if not str:
return
ptd = pandas.Timedelta(str)
td = pandas.Timedelta.to_pytimedelta(ptd)
return td
def str_to_timedelta2(delta: str = None):
if not str:
return
return pandas.Timedelta(str).to_pytimedelta()
참고로 예외 처리가 전혀 되어 있지 않습니다. 당장 테스트 해보니 예약어가 아닌 문자가 들어있으면 ValueError 가 발생합니다.
>>> pandas.Timedelta("3kfjkasd")
Traceback (most recent call last):
File "pandas/_libs/tslibs/timedeltas.pyx", line 513, in pandas._libs.tslibs.timedeltas.parse_timedelta_unit
KeyError: 'kfjkasd'
숫자값 뒤에 단위가 지정되지 않아도 ValueError 가 발생합니다.
>>> pandas.Timedelta("1w2d3t4s5l6u7h8m9n10")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pandas/_libs/tslibs/timedeltas.pyx", line 1194, in pandas._libs.tslibs.timedeltas.Timedelta.__new__
File "pandas/_libs/tslibs/timedeltas.pyx", line 437, in pandas._libs.tslibs.timedeltas.parse_timedelta_string
ValueError: have leftover units
사용할 수 있는 값은 1주일(1w), 2일(2d), 3분(3t 또는 3m), 4초(4s), 5밀리초(5l), 6마이크로초(6u), 7나노초(7n) 정도가 있습니다.
더 다양한 표현이 있으니, 자세한 내용은 api 글을 참고하시기 바랍니다.
>>> pandas.Timedelta("1w2d3t4s5l6u7h8m9n")
Timedelta('9 days 07:11:04.005006009')