내 마음대로 공간

시계열분석

날짜와 시간의 처리

In [1]:
# 초기화 
## 모듈을 가져온다. 
import pandas as pd
import numpy as np
from pandas import Series, DataFrame

# 그래픽에 필요한 페키지와 라이브라리...
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
%matplotlib inline

## 폰트지정....
plt.rcParams["font.family"] = 'NanumGothic'
plt.rcParams["font.size"] = 18
# 폰트를 지정하면 그래프에서 마이너스 폰트가 깨져서 다음과 같이 셋팅
mpl.rcParams["axes.unicode_minus"] = False

날짜 포멧팅

In [2]:
now = '2019-05-30 02:00 pm'
In [3]:
type(now)
Out[3]:
str
In [4]:
# 날짜와 시간은 해당 타입에 맞는 날짜와 시간을 사용해야 한다. 
In [6]:
from datetime import datetime, date, time
# 모듈은 datetime 폴더 안에 datetime.py, date.py, time.py가 있어서(또는 구조로) 위와 같이 from ~ import 한다. 
In [7]:
# 날짜는 [일자-시간] --> datetime, date, time 세개가 있는 이유.
In [8]:
# datetime은 원하는 단위까지 지정하면된다. 
# 지정되지 않은 값은 0 이다. 
dt = datetime(2019, 5, 30, 16)
In [9]:
# 문자열 포멧을 이용해서 각 요소를 가져....
'{0}-{1}-{2}'.format(dt.year, dt.month, dt.day)
Out[9]:
'2019-5-30'
In [15]:
# 날짜에 대한 포멧을 이용해 다음과 같이 할수도 있다. 
'{0.year}-{0.month}-{0.day} {0.hour}:{0.minute:02d}'.format(dt)
Out[15]:
'2019-5-30 16:00'
In [16]:
# date 추출
dt.date()
Out[16]:
datetime.date(2019, 5, 30)
In [17]:
# 시간 추출
dt.time()
Out[17]:
datetime.time(16, 0)
In [20]:
dt.strftime('%Y-%m-%d %H:%M')
Out[20]:
'2019-05-30 16:00'
In [21]:
# strftime 함수는 한국어 처리가 안된다. 
# dt.strftime('%Y년%m월%일 %H:%M')  --> 오류가 발생 한다. 
# 한글을 쓰기 위해서는 문자열 포멧을 사용해야 한다. 
'{0.year}{0.month}{0.day}{0.hour}:{0.minute:02d}'.format(dt)
Out[21]:
'2019년5월30일 16:00'
In [22]:
# 문자열을 datetime으로 변환하기 
# 국가별로 년, 월, 일의 위치가 다르다. 
# 단서 변수는 해석하는 방식(지역화)에 따라서 값이 달라진다. 
# 년/월/일, 월/일/년, 일/월/년   --> 국가별로 다르게 봄.
단서 = "07/11/17"
In [28]:
datetime.strptime(단서, '%d/%m/%y')
Out[28]:
datetime.datetime(2017, 11, 7, 0, 0)
In [26]:
# 문자열을 읽어서 변환하는 경우 한글을 사용할 수 있다. 
datetime.strptime("2019년 5월 30일", '%Y년 %m월 %d일')
Out[26]:
datetime.datetime(2019, 5, 30, 0, 0)
In [29]:
from dateutil.parser import parse
In [30]:
## 문자열을 알아서 파싱....
parse('May 15, 2019 04:50 pm')
Out[30]:
datetime.datetime(2019, 5, 15, 16, 50)
In [31]:
# parse 함수는 한국어 처리가 안된다.
# 에러 발생.
# parse('2017년 9월 15일')
# strptime 함수를 사용해야 한다. 

타입 변환

In [32]:
# 날짜를 요소로 가지는 시리즈
날짜시리즈 = Series(['2019-03-01', '2019-05-30'])
In [33]:
날짜시리즈
Out[33]:
0    2019-03-01
1    2019-05-30
dtype: object
In [34]:
## 날짜 값을 가지는 문자열을 날짜 타입으로 변환.
pd.to_datetime(날짜시리즈)
Out[34]:
0   2019-03-01
1   2019-05-30
dtype: datetime64[ns]

요일

In [35]:
now = datetime.now()
In [36]:
print(now)
2019-05-30 16:27:29.507328
In [37]:
now.weekday()
Out[37]:
3
In [38]:
# 숫자로 나오는 이유는 문자의 지역화 문제가 있기 때문이다. 
In [39]:
# 요일.... 리스트로 변환 
요일맵 = list('월화수목금토일')
요일맵
Out[39]:
['월', '화', '수', '목', '금', '토', '일']
In [40]:
요일맵[now.weekday()]
Out[40]:
'목'

날짜 타입을 이용한 데이터 그룹화.

In [41]:
## 식당의 주문 자료....
식당 = pd.read_excel('data/food_order.xlsx')
식당[:5]
Out[41]:
date dine_type corner menu is_sold_out use_count pred_count additional good ok bad diff_use_pred year month day wday
0 2013-08-06 dinner grill & fry 훈제연어벤또(200개) F 213 0 0 0 0 0 -213 2013 8 6 1
1 2013-08-06 dinner rice & soup 1 뚝배기 우거지 갈비탕 F 261 0 0 0 0 0 -261 2013 8 6 1
2 2013-08-06 lunch noodle bar 판모밀정식 F 267 0 0 0 0 0 -267 2013 8 6 1
3 2013-08-06 breakfast rice & soup 1 설렁탕정식 F 1 0 0 0 0 0 -1 2013 8 6 1
4 2013-08-06 lunch rice & soup 1 A. 부대찌개정식 F 376 0 0 0 0 0 -376 2013 8 6 1
In [45]:
# 모든행의 데이터를 가져오고, 0~5 까지의 칼럼 가져오는데.... is_sold_out은 제외....
식당 = 식당.iloc[:, :6].drop('is_sold_out', axis=1)
In [46]:
식당[:5]
Out[46]:
date dine_type corner menu use_count
0 2013-08-06 dinner grill & fry 훈제연어벤또(200개) 213
1 2013-08-06 dinner rice & soup 1 뚝배기 우거지 갈비탕 261
2 2013-08-06 lunch noodle bar 판모밀정식 267
3 2013-08-06 breakfast rice & soup 1 설렁탕정식 1
4 2013-08-06 lunch rice & soup 1 A. 부대찌개정식 376
In [47]:
식당.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6825 entries, 0 to 6824
Data columns (total 5 columns):
date         6825 non-null datetime64[ns]
dine_type    6825 non-null object
corner       6825 non-null object
menu         6825 non-null object
use_count    6825 non-null int64
dtypes: datetime64[ns](1), int64(1), object(3)
memory usage: 266.7+ KB
In [48]:
## date 칼럼의 첫번째 행의 년도 
식당['date'][0].year
Out[48]:
2013
In [53]:
## 연도별-corner 데이터 추세...
## 람다식을 이용해서 ...
## 식당의 date 칼럼의 시리즈에서 map 함수의 매개변수로 날짜를 받아서 년도를 반환.....
##def 날짜반환(d):
##    return d.year
연도 = 식당['date'].map(lambda d: d.year)
In [54]:
연도.sample(10)
Out[54]:
6790    2015
381     2013
4349    2014
1976    2014
6675    2015
1846    2014
2360    2014
1934    2014
1455    2014
1293    2014
Name: date, dtype: int64
In [55]:
# 연도-코너의 user_count 평균을 구한다. 
# 
식당.pivot_table('use_count',
              aggfunc='mean',
              index='corner',
              columns=연도
              )
Out[55]:
date 2013 2014 2015
corner
after school 160.355191 143.287815 123.577778
burger&pizza 147.179191 146.825902 137.977695
grill & fry 261.616667 218.817610 214.850746
noodle bar 209.266667 175.964135 164.936803
rice & soup 1 323.147368 205.251034 181.417476
rice & soup 2 NaN 240.285000 244.340909
take out 249.029536 195.580027 148.888620
In [58]:
## 각 년월별 코너별 주문수량
년월 = 식당['date'].map(lambda d: "{0.year}-{0.month:02d}".format(d))
In [59]:
년월.sample(10)
Out[59]:
2591    2014-05
3390    2014-08
6386    2015-06
6817    2015-07
407     2013-10
281     2013-09
2961    2014-06
2697    2014-06
3691    2014-09
2199    2014-04
Name: date, dtype: object
In [60]:
년월사용량 = 식당.pivot_table("use_count", aggfunc="mean", index=년월, columns="corner")
In [61]:
년월사용량[:10]
Out[61]:
corner after school burger&pizza grill & fry noodle bar rice & soup 1 rice & soup 2 take out
date
2013-08 154.333333 188.352941 299.565217 221.695652 330.976190 NaN 230.600000
2013-09 152.138889 156.700000 327.096774 224.419355 341.907407 NaN 244.528302
2013-10 157.190476 139.047619 266.571429 214.023810 329.539683 NaN 260.343284
2013-11 174.476190 146.452381 249.619048 209.309524 322.619048 NaN 267.692308
2013-12 159.452381 132.571429 199.547619 186.476190 295.984127 NaN 233.619048
2014-01 174.333333 142.282051 222.400000 199.625000 317.116667 NaN 249.383333
2014-02 172.589744 140.948718 220.282051 190.692308 279.155172 199.500000 254.368421
2014-03 170.952381 153.500000 221.809524 181.476190 203.682540 257.400000 252.161290
2014-04 166.487805 146.309524 224.829268 174.609756 190.919355 229.523810 243.714286
2014-05 145.000000 125.138889 231.027778 183.722222 182.907407 259.166667 236.508772
In [62]:
년월사용량.plot()
Out[62]:
<matplotlib.axes._subplots.AxesSubplot at 0x2c0c3453390>
In [ ]:
 
728x90

'프로그래밍 > Python' 카테고리의 다른 글

조건문 정리  (0) 2023.05.21
기초 자료형 I 정리  (0) 2023.04.19
파이썬(Python) 고급연산  (0) 2020.12.31
파이썬(Python) 고급문자열 처리  (0) 2020.12.31
파이썬(Python) - 분석 실습 영화평점분석  (0) 2020.12.29

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading