SW 개발

[python] 문자열을 datetime 으로 시간쉽게 다루기 예제

. . . 2020. 10. 5. 17:12
반응형

취미로 개발하다보니, 시간관련 이런저런이야기..

그냥 취미로 이것저것 python 을 이용하여 각종 크롤링같은것을 만들다보면 시간을 잘 다루지 못하여 빠르게 기능구현을 하지 못했다.

예를들면.. 각종 커뮤니티 게시판을 db 화 하다보면 늘 시간 부분이 발목을 잡았다. 각 사이트마다 다음과 같이 다양한 시간형태가 존재하였다.

  • 2009-01-01
  • 2009.01.01
  • 20090101
  • 2009-01-01 12:12
  • 12:12
  • 오늘
  • today
  • 12:12:00

위와같이 오만가지 날짜형태를 각각 파싱하기위해서 (각 사이트별로) 코드를 따로 작성하다보니 불편하기도 하였고, 매번 코딩하는것이 귀찮았다.

그래서 각종 시간관련 문자열을 그냥 한번에 datetime 형태로 변환하는 함수를 만들었다.

예제코드

참고로... 다음의 예제코드는 그냥 취미로 가끔 개발하는 개발자의 초보적인 수준의 예제 코드이다. 퍼포먼스나 효율적인것은 생각하지 않았다. 참고만 하시길... ;;

  • time_str_patterns 부분은 https://docs.python.org/ko/3/library/datetime.html#strftime-and-strptime-format-codes 부분에 나오는 형태로 format 문자열을 작성한다.
  • 매번 여러개의 포맷문자열을 비교해보고 성공했을때만, datetime 형태로 리턴을 시킨다.
  • 가끔 문자열이 아니라 이미 변환된 datetime 형태를 넘기는 경우가 있어서 type 별로 그냥 리턴하도록 하였다.

def time_conv(timestr, fix_invalid_time=False ):

  if type(timestr) is datetime.datetime :
    return timestr

  if type(timestr) is datetime.date :
      return timestr

  time_str_patterns = ['%m-%d', '%m.%d', '%m/%d',
             '%H:%M', '%H:%M:%S',
             '%Y%m%d', '%Y/%m/%d', '%y/%m/%d', '%Y-%m-%d', '%y-%m-%d', '%y%m%d', '%Y%m%d', '%Y.%m.%d',
             '%Y-%m-%d%H:%M:%S','%Y-%m-%d%H:%M','%Y.%m.%d%H:%M:%S','%Y.%m.%d%H:%M', '%Y-%m-%d_%H:%M:%S',
             '%Y-%m-%d-%p-%I:%M']
  convert_time_dbg_msg = False

  found_date = False

  # target_date = datetime.time(0, 0, 0) # empty time
  target_date = datetime.datetime.today()  # empty time

  timestr = timestr.replace(' ', '')

  pprint('convert time ==> ' + timestr) if convert_time_dbg_msg == True else None

  # case 1
  for time_str_pattern in time_str_patterns:
    if not found_date:
      try:
        target_date = datetime.datetime.strptime(timestr, time_str_pattern)
        found_date = True
        pprint('found time type %s' % (time_str_pattern)) if convert_time_dbg_msg == True else None
        break
      except:
        found_date = False

  # case 5
  if found_date == False:
    if (timestr.find('오늘') >= 0 or timestr.lower().find('today') >= 0):
      target_date = datetime.date.today()
      found_date = True
      pprint('found time case 5') if convert_time_dbg_msg == True else None
    else:
      found_date = False

  # last filter : 아무것도 못찾으면 그냥 오늘, 현재시간으로
  if found_date == False and fix_invalid_time == True :
    target_date = datetime.date.today()
    found_date == True

  if found_date == False :
    return None

  today_date = datetime.date.today()

  if target_date.year == 1900 and target_date.month == 1 and target_date.day == 1:
    target_date = target_date.replace(year=today_date.year, month=today_date.month, day=today_date.day)
    pprint('fix time case 1') if convert_time_dbg_msg == True else None
  elif target_date.year == 1900:
    target_date = target_date.replace(year=today_date.year)
    pprint('fix time case 2') if convert_time_dbg_msg == True else None

  return target_date

위의 함수를 이용하면 각종 게시판의 시계문자열을 datetime 으로 한번에 변환한다.

time_conv('2009-01-01')
time_conv('2009.01.01')
time_conv('20090101')
time_conv('2009-01-01 12:12')
time_conv('12:12')
time_conv('오늘')
time_conv('today')
time_conv('12:12:00')

역시 파이썬은 쉽고 편리하고 재밌어. >_<

반응형