새소식

Programming/python

[python] "1m" 등의 문자열을 받아 시간으로 변환하기

  • -

제목과 같은 상황이 필요해서 찾아봤지만 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')

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.