'문자열을 Python datetime으로 변환하기'에 해당되는 글 1건

  1. 2019.12.22 [Python pandas] Pyhon datetime, pandas Timestamp을 문자열(string)로 변환, 문자열을 datetime, Timestamp로 변환하기

지난번 포스팅에서는 Python standard datetimepandas Timestamp 객체로 날짜-시간 데이터를 입력, 변환, 조회하는 방법을 소개하였습니다. 


이번 포스팅에서는 


(1) Python datetime, pandas Timestamp 객체를 문자열(string)로 변환

    (Converting native Python datetime, pandas Timestamp objects to Strings)


(2) 문자열(string)을 Python datetime, pandas Timestamp 객체로 변환

    (Converting Strings to Python datetime, pandas Timestamp)


에 대해서 차례대로 알아보겠습니다. 





  (1) Python datetime, pandas Timestamp 객체를 문자열(string)로 변환

      (Converting native Python datetime, pandas Timestamp objects to Strings)



(1-1) str() 함수를 이용하여 Python datetime 객체를 문자열(string)로 변환하기



# Create Python datetime objects

import datetime as dt

ts = dt.datetime(2019, 12, 22, 13, 30, 59) # (year, month, day, hour, minume, second)

type(ts)

[Out]: datetime.datetime

 

ts

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)



# converting Python datetime objects to Strings

ts_str = str(ts)

type(ts_str)

[Out]: str


ts_str

[Out]: '2019-12-22 13:30:59'


# indexing from a string

print('year-month-day:', ts_str[:10])

[Out]: year-month-day: 2019-12-22

print('hour:minute:second:', ts_str[10:])
[Out]: hour:minute:second:  13:30:59





(1-2) strftime() 메소드를 이용하여 Python datetime 객체를 문자열(string)로 변환하기


Python standard datetime 객체의 포맷에 맞추어서 strftime() 메소드의 괄호 안에 형태 지정(format specification)을 해줍니다. 가령 4자리 년(4-digit year), 월(month), 일(day), 0-23시간(0-23 hour), 분, 초의 형태로 지정을 하고 싶으면 strftime('%Y-%m-%d %H:%M:%S') 로 설정을 해주면 됩니다. 



import datetime as dt


ts = dt.datetime(2019, 12, 22, 13, 30, 59) # (year, month, day, hour, minume, second)

ts

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)


ts_strftime = ts.strftime('%Y-%m-%d %H:%M:%S')

type(ts_strftime)

[Out]: str


ts_strftime

[Out]: '2019-12-22 13:30:59'




년도를 '2자리 연도(2-digit year)'로 문자열 변환하고자 하면 '%y' 를 사용하며, 0-11시간(0-11 hour) 형태로 시간을 문자열 변환하고자 하면 '%I'를 사용합니다. 



# %Y: 4-digit year vs. %y: 2-digit year

# %H: 24-hour clock[00, 23] vs. %I: 12-hour clock [01, 11]

ts.strftime('%y-%m-%d %I:%M:%S')

[Out]: '19-12-22 01:30:59'

 



datetime.datetime(2019, 12, 22).strftime('%w') 는 주 단위의 요일을 일요일은 '0', 월요일은 '1', ..., 토요일은 '6'으로 순서대로 정수의 문자로 반환합니다. 



# '%w': weekday

print('----- %w: weekday as integer -----')

print('Sunday    :', dt.datetime(2019, 12, 22).strftime('%w'))

print('Monday    :', dt.datetime(2019, 12, 23).strftime('%w'))

print('Tuesday   :', dt.datetime(2019, 12, 24).strftime('%w'))

print('Wednesday :', dt.datetime(2019, 12, 25).strftime('%w'))

print('Thursday  :', dt.datetime(2019, 12, 26).strftime('%w'))

print('Friday    :', dt.datetime(2019, 12, 27).strftime('%w'))

print('Saturday  :', dt.datetime(2019, 12, 28).strftime('%w'))


[Out]: 
----- %w: weekday as integer -----
Sunday    : 0
Monday    : 1
Tuesday   : 2
Wednesday : 3
Thursday  : 4
Friday    : 5
Saturday  : 6



datetime.datetime(2019, 12, 22).strftime('%U')는 년 중 해당 주의 숫자(week nuber of the year)를 반환합니다. 이때 '%U'는 일요일이 주의 첫번째 일로 간주하는 반면에 '%W'는 월요일을 주의 첫번째 일로 간주하는 차이가 있습니다. 



# '%U': week number of the year [00, 53]. 

# Sunday is considered the first day of the week

dt.datetime(2019, 12, 22).strftime('%U') # '2019-12-22' is Sunday

[Out]: '51'

 




# '%W': week number of the year [00, 53]. 

# Monday is considered the first day of the week

dt.datetime(2019, 12, 22).strftime('%W') # '2019-12-22' is Sunday

[Out]: '50'

 

dt.datetime(2019, 12, 23).strftime('%W') # '2019-12-23' is Monday

[Out]: '51'





(1-3) pandas Timestamp를  strftime() 메소드를 사용하여 문자열(string)로 변환하기



import pandas as pd


pd_ts = pd.Timestamp(2019, 12, 22, 13, 30, 59)

pd_ts

[Out]: Timestamp('2019-12-22 13:30:59')


# convert pandas Timestamp to string

pd_ts.strftime('%y-%m-%d %I:%M:%S')

[Out]: '19-12-22 01:30:59'

 





  (2) 문자열(string)을 Python datetime, pandas Timestamp 객체로 변환

       (Converting Strings to Python datetime, pandas Timestamp)



(2-1) datetime.strptime() 함수를 이용하여 문자열을 Python datetime.datetime 객체로 변환하기


strptime(문자열, 날짜-시간 포맷) 의 괄호 안에는 문자열의 형태에 맞추어서 반환하고자 하는 날짜-시간 포맷을 설정해줍니다. 



# create a string with 'year-month-day hour:minute:second'

ts_str = '2019-12-22 13:30:59'

ts_str

[Out]: '2019-12-22 13:30:59'


# convert a string to datetime object

import datetime as dt

dt.datetime.strptime(ts_str, '%Y-%m-%d %H:%M:%S')

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)

 



여러개의 날짜-시간 문자열로 구성된 리스트를 List Comprehension 을 이용해서 datetime 객체 리스트로 만들 수 있습니다. 



# convert strings list using list comprehension

ts_str_list = ['2019-12-22', '2019-12-23', '2019-12-24', '2019-12-25']


[dt.datetime.strptime(date, '%Y-%m-%d') for date in ts_str_list]

[Out]: 
[datetime.datetime(2019, 12, 22, 0, 0),
 datetime.datetime(2019, 12, 23, 0, 0),
 datetime.datetime(2019, 12, 24, 0, 0),
 datetime.datetime(2019, 12, 25, 0, 0)]




아래의 예는 pandas DataFrame에서 "Date" 문자열 칼럼과 "Time" 문자열 칼럼이 분리되어 있는 경우, (1) 먼저 이 두 칼럼을 "DateTime" 이라는 하나의 칼럼으로 합치고, (2) 그 다음에 문자열(Strings)을 DateTime 객체로 변환하는 방법에 대한 소개입니다. 


apply() 함수 안에 strptime() 함수를 lambda 무기명 함수 형태로 사용하였으며, 날짜와 시간 포맷도 위와는 조금 다르게 설정해보았습니다. ('%d/%m/%Y %H.%M.%S'))



import pandas as pd


# make a sample DataFrame with Date and Time (string format)

Date = ['01/12/2019', '01/12/2019', '01/12/2019']

Time = ['09.01.00', '09.01.01', '09.01.02']

val = [1, 2, 3]


df = pd.DataFrame({'Date': Date,

                   'Time': Time,

                   'val': val})


df

[Out]:

DateTimeval
001/12/201909.01.001
101/12/201909.01.012
201/12/201909.01.023

# combine 'Date' and 'Time' column as 'DateTime'

df['DateTime'] = df.Date + ' ' + df.Time

df

[Out]:

DateTimevalDateTime
001/12/201909.01.00101/12/2019 09.01.00
101/12/201909.01.01201/12/2019 09.01.01
201/12/201909.01.02301/12/2019 09.01.02


# check date type : strings

type(df.DateTime[0])

[Out]: str


# convert 'DateTime' column from strings to datetime object 

# using datetime.strptime() and lambda, apply function

from datetime import datetime


df.DateTime = df.DateTime.apply(lambda x: datetime.strptime(x, '%d/%m/%Y %H.%M.%S'))

df.set_index('DateTime', inplace=True)

df

[Out]:

DateTimeval
DateTime
2019-12-01 09:01:0001/12/201909.01.001
2019-12-01 09:01:0101/12/201909.01.012
2019-12-01 09:01:0201/12/201909.01.023


# check data type : datetime object Timestamp

type(df.index[0])

[Out]: pandas._libs.tslibs.timestamps.Timestamp




datetime.strptime(문자열, 날짜-시간 포맷) 의 경우 날짜-시간 문자열의 형태가 제한적이어서 아래와 같은 순서/형태의 문자열일 경우 ValueError 가 발생합니다. 이럴 경우 (2-2) dateutil.parser 의 parse() 함수를 사용하여 유연하게 날짜-시간 문자열을 파싱할 수 있습니다. 



dt.datetime.strptime('Dec 22, 2019 13:30:59', '%m %d, %Y %H:%M:%S')

[Out]: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-42-7dfd356853ba> in <module>
----> 1 dt.datetime.strptime('Dec 22, 2019 13:30:59', '%m %d, %Y %H:%M:%S')

~/anaconda3/envs/py3.6_tf2.0/lib/python3.6/_strptime.py in _strptime_datetime(cls, data_string, format)
    563     """Return a class cls instance based on the input string and the
    564     format string."""
--> 565     tt, fraction = _strptime(data_string, format)
    566     tzname, gmtoff = tt[-2:]
    567     args = tt[:6] + (fraction,)

~/anaconda3/envs/py3.6_tf2.0/lib/python3.6/_strptime.py in _strptime(data_string, format)
    360     if not found:
    361         raise ValueError("time data %r does not match format %r" %
--> 362                          (data_string, format))
    363     if len(data_string) != found.end():
    364         raise ValueError("unconverted data remains: %s" %

ValueError: time data 'Dec 22, 2019 13:30:59' does not match format '%m %d, %Y %H:%M:%S'




(2-2) dateutil 라이브러리의 parser.parse() 함수를 이용하여 문자열을 datetime 객체로 변환하기


아래의 3개의 예에서 보는 바와 같이, dateutil 라이브러리의 parser.parse() 함수는 괄호 안에 다양한 형태의 날짜-시간 문자열을 유연하게 인식하여 datetime.datetime 객체로 반환해줍니다. (2-1)의 datetime.strptime() 함수와 비교했을 때 dateutil.parser의 parse() 함수는 상대적으로 편리하고 강력합니다. 



# Converting Strings to datetime.datetime objects using parser.parse()

from dateutil.parser import parse


parse('2019-12-22 13:30:59')

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)


parse('Dec 22, 2019 13:30:59')

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)


parse('Dec 22, 2019 01:30:59 PM')

[Out]: datetime.datetime(2019, 12, 22, 13, 30, 59)




parse() 함수의 괄호 안 문자열의 첫번째 숫자가 '월(month)' 인지 아니면 '일(day)' 인지를 dayfirst=False (default), dayfirst=True 옵션을 사용하여 명시적으로 지정해줄 수 있습니다. 



# month first

parse('01/12/2019 13:30:59')

[Out]: datetime.datetime(2019, 1, 12, 13, 30, 59)


# day first

parse('01/12/2019 13:30:59', dayfirst=True)

[Out]: datetime.datetime(2019, 12, 1, 13, 30, 59)




여러개의 날짜-시간 문자열로 구성된 리스트를 가지고 List Comprehension을 사용하여 datetime.datetime 객체 리스트를 생성할 수 있습니다. 



# convert strings list using list comprehension

ts_str_list = ['2019-12-22', '2019-12-23', '2019-12-24', '2019-12-25']

[parse(date) for date in ts_str_list]

[Out]: 
[datetime.datetime(2019, 12, 22, 0, 0),
 datetime.datetime(2019, 12, 23, 0, 0),
 datetime.datetime(2019, 12, 24, 0, 0),
 datetime.datetime(2019, 12, 25, 0, 0)]

 




(3-3) pandas 의 pd.to_datetime()으로 날짜-시간 문자열을 pandas Timestamp 로 변환하기


* pandas Timestamp 에 대한 자세한 설명은 https://rfriend.tistory.com/497 참조하세요



# pandas Timestamp

import pandas as pd


pd.to_datetime('2019-12-22 13:30:59')

[Out]: Timestamp('2019-12-22 13:30:59')




여러개의 날짜-시간 문자열로 구성된 문자열 리스트를 가지고 pandas.to_datetime() 함수를 사용하여 pandas DatetimeIndex 를 생성할 수 있습니다. 이렇게 생성된 DatatimeIndex는 시계열 데이터로 이루어진 pandas Series나 pandas DataFrame 를 생성할 때 index로 사용할 수 있습니다. 



# pandas DatetimeIndex

ts_str_list = ['2019-12-22', '2019-12-23', '2019-12-24', '2019-12-25']

pd.to_datetime(ts_str_list)

DatetimeIndex(['2019-12-22', '2019-12-23', '2019-12-24', '2019-12-25'], dtype='datetime64[ns]', freq=None)



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)


728x90
반응형
Posted by Rfriend
,