[Python pandas] Pyhon datetime, pandas Timestamp을 문자열(string)로 변환, 문자열을 datetime, Timestamp로 변환하기
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 12. 22. 22:08지난번 포스팅에서는 Python standard datetime과 pandas 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)
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
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
dt.datetime(2019, 12, 23).strftime('%W') # '2019-12-23' is Monday
|
(1-3) pandas Timestamp를 strftime() 메소드를 사용하여 문자열(string)로 변환하기
import pandas as pd pd_ts = pd.Timestamp(2019, 12, 22, 13, 30, 59) pd_ts
# 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
# 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]:
# combine 'Date' and 'Time' column as 'DateTime' df['DateTime'] = df.Date + ' ' + df.Time df [Out]:
# 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]:
# 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')
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')
# 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')
|
여러개의 날짜-시간 문자열로 구성된 문자열 리스트를 가지고 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) |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)