LiJell's 성장기

17.python_datetime_expression 본문

Bigdata/파이썬_Python

17.python_datetime_expression

All_is_LiJell 2022. 1. 10. 22:05
반응형

Modified on Jan 10
# -_- coding: utf-8 -_-
"""
Created on Wed Dec 29 11:23:53 2021

@author: hanju
"""

17. 날짜표현

  • 월별, 일별, 요일별 집계

  • 현재 날짜 - 입사일자 = 근무 일자

  • 현재 날짜

    import numpy as np
    import pandas as pd
    from pandas import Series, DataFrame
    from datetime import datetime
    datetime.now()
    # datetime.datetime(2021, 12, 29, 11, 26, 59, 534499)
d1 = datetime.now()  
type(d1)

# datetime.datetime

d1.year # 연  
d1.month # 월  
d1.day # 일

1) 날짜 파싱

d2 = '2022/01/01'
d2.year
# 'str' object has no attribute 'year'

datetime.strptime(date_string, format)
#벡터 연산이 안됨

datetime.strptime(d2, '%Y/%m/%d')
# datetime.datetime(2022, 1, 1, 0, 0)

datetime.strptime('09/12/25', '%m/%d/%y') 
# datetime.datetime(2025, 9, 12, 0, 0) 

# Series 벡터 연산 불가
s1 = Series(['2022/01/01','2022/01/02','2022/01/03'])
datetime.strptime(s1, '%Y/%m/d')
# strptime() argument 1 must be str, not Series
s1.map(lambda x: datetime.strptime(x, '%Y/%m/%d'))
'''
0   2022-01-01
1   2022-01-02
2   2022-01-03
dtype: datetime64[ns]
'''

2) pd.to_datetime

  • 벡터 연산가능

    s1
    '''
    0    2022/01/01
    1    2022/01/02
    2    2022/01/03
    dtype: object
    '''

pd.to_datetime(s1)
'''
0 2022-01-01
1 2022-01-02
2 2022-01-03
dtype: datetime64[ns]
'''
pd.to_datetime(s1, format='%Y/%m/%d')

#### 3) 날짜 포맷 변경 datetime.strftime (string format time)



```python
d1 = datetime.now()
d1
# datetime.datetime(2021, 12, 29, 11, 42, 53, 343371)
datetime.strftime(d1, '%A') # 요일 리턴
# Wednesday'
datetime.strftime(d1,'%m-%d,%Y') #'12-29,2021'

datetime.strftime(d1, '%Y') #2021
datetime.strftime(d1, '%y') #21

s1
datetime.strftime(s1, '%Y') # 벡터연산 안됨
# descriptor 'strftime' for 'datetime.date' objects doesn't apply to a 'Series' object

s2 = pd.to_datetime(s1, infer_datetime_format =True)
s2
datetime.strftime(s2,'%Y') #벡터연산 안됨
# descriptor 'strftime' for 'datetime.date' objects doesn't apply to a 'Series' object

s2.map(lambda x: datetime.strftime(x, '%Y'))
'''
0    2022
1    2022
2    2022
dtype: object
'''

s3 = pd.DataFrame({'date' : ['01-05-21','01-06-21','01-07-21',]})
s3.dtypes
s3

4) 날짜 연산 ***

d1 # 현재 날짜
# datetime.datetime(2021, 12, 29, 11, 42, 53, 343371)
d1+100 # 안되네 100일 기념일 프로그램 ㅠ 
# TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'int'

# 오늘 날짜로부터 100일 뒤 날짜 리턴 불가 (타입이 틀려)
1. offset
from pandas.tseries.offsets import Day, Hour, Second
d1 + Day(100)
# Timestamp('2022-04-08 11:42:53.343371')
2. timedelta (날짜와의 차이)
from datetime import timedelta
d1 + timedelta(100)
# datetime.datetime(2022, 4, 8, 11, 42, 53, 343371)
# 오늘 일자부터 100일 뒤 리턴해줌
3. (실무용) DateOffset *** (significantly important)
d1 + pd.DateOffset(months = 4)
# Timestamp('2022-04-29 11:42:53.343371')
4. 날짜 - 날짜
d1 # datetime.datetime(2021, 12, 29, 11, 42, 53, 343371)
d2 #'2022/01/01'
d3 = d1 - datetime.strptime(d2, '%Y/%m/%d')
# datetime.timedelta(days=-3, seconds=42173, microseconds=343371)

d3.days # -3
d3.seconds # 42173

참고자료

deli = pd.read_csv('./data/delivery.csv', encoding= 'cp949')
deli.dtypes
'''
일자       int64
시간대      int64
업종      object
시도      object
시군구     object
읍면동     object
통화건수     int64
dtype: object
'''
deli.head()
'''
         일자  시간대           업종     시도  시군구   읍면동  통화건수
0  20180201    0  음식점-족발/보쌈전문  서울특별시  강남구   논현동     5
1  20180201    0  음식점-족발/보쌈전문  서울특별시  강남구   역삼동     5
2  20180201    0  음식점-족발/보쌈전문  서울특별시  강서구  내발산동     5
3  20180201    0  음식점-족발/보쌈전문  서울특별시  강서구   화곡동     5
4  20180201    0  음식점-족발/보쌈전문  서울특별시  동작구  신대방동     5
'''
deli.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 119189 entries, 0 to 119188
Data columns (total 7 columns):
 #   Column  Non-Null Count   Dtype 
---  ------  --------------   -----
 0   일자      119189 non-null  int64 
 1   시간대     119189 non-null  int64 
 2   업종      119189 non-null  object
 3   시도      119189 non-null  object
 4   시군구     119189 non-null  object
 5   읍면동     119189 non-null  object
 6   통화건수    119189 non-null  int64 
dtypes: int64(3), object(4)
memory usage: 6.4+ MB
'''
deli.describe()
'''
                 일자            시간대           통화건수
count  1.191890e+05  119189.000000  119189.000000
mean   2.018021e+07      15.576362       9.916486
std    8.234111e+00       5.321848      13.904536
min    2.018020e+07       0.000000       5.000000
25%    2.018021e+07      13.000000       5.000000
50%    2.018021e+07      17.000000       5.000000
75%    2.018022e+07      19.000000       7.000000
max    2.018023e+07      23.000000     229.000000
'''
deli.boxplot()

날짜 파싱

deli
deli['일자']
type(deli['일자'])
pd.to_datetime(deli['일자'], format = '%Y%m%d')
'''
0        2018-02-01
1        2018-02-01
2        2018-02-01
3        2018-02-01
4        2018-02-01

119184   2018-02-28
119185   2018-02-28
119186   2018-02-28
119187   2018-02-28
119188   2018-02-28
Name: 일자, Length: 119189, dtype: datetime64[ns]
'''

deli['일자'] = pd.to_datetime(deli['일자'], format = '%Y%m%d')
deli['일자']

요일 리턴

datetime.strftime(deli['일자'],'%A')
# TypeError: descriptor 'strftime' for 'datetime.date' objects
# doesn't apply to a 'Series' object

deli['일자'].map(lambda x: datetime.strftime(x,'%A'))
'''
0          Thursday
1          Thursday
2          Thursday
3          Thursday
4          Thursday

119184    Wednesday
119185    Wednesday
119186    Wednesday
119187    Wednesday
119188    Wednesday
Name: 일자, Length: 119189, dtype: object
'''

요일별로 그룹화 (통화건수)

deli ['요일'] = deli['일자'].map(lambda x: datetime.strftime(x,'%A'))
deli # 이제 deli에 요일이 생김
'''
일자  시간대           업종     시도   시군구   읍면동  통화건수         요일
0      2018-02-01    0  음식점-족발/보쌈전문  서울특별시   강남구   논현동     5   Thursday
1      2018-02-01    0  음식점-족발/보쌈전문  서울특별시   강남구   역삼동     5   Thursday
2      2018-02-01    0  음식점-족발/보쌈전문  서울특별시   강서구  내발산동     5   Thursday
3      2018-02-01    0  음식점-족발/보쌈전문  서울특별시   강서구   화곡동     5   Thursday
4      2018-02-01    0  음식점-족발/보쌈전문  서울특별시   동작구  신대방동     5   Thursday
          ...  ...          ...    ...   ...   ...   ...        ...
119184 2018-02-28   23           피자  서울특별시  서대문구  북가좌동     5  Wednesday
119185 2018-02-28   23           피자  서울특별시   중랑구   망우동     5  Wednesday
119186 2018-02-28   23           피자  서울특별시   중랑구   면목동     5  Wednesday
119187 2018-02-28   23           피자  서울특별시   양천구   신정동     5  Wednesday
119188 2018-02-28   23           피자  서울특별시   강서구  내발산동     6  Wednesday

[119189 rows x 8 columns]
'''

total = deli.groupby('요일')['통화건수'].sum()
'''
요일
Friday       162037
Monday       142157
Saturday     196429
Sunday       196096
Thursday     150316
Tuesday      158544
Wednesday    176357
Name: 통화건수, dtype: int64
'''

정렬 바꾸기

total[['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']]
  • 월화수목금토 순으로 재배치 해야 함
  • 아직까지는 정렬로 배치 안됨, 색인으로 처리해야 함
반응형

'Bigdata > 파이썬_Python' 카테고리의 다른 글

19.python_pandas_practice  (0) 2022.01.10
18.python_visualization  (0) 2022.01.10
16.python_NA_missing_duplicate_value  (0) 2022.01.10
15.python_stack_unstack_pivot_table  (0) 2022.01.08
14.python.drop_shift_rename  (0) 2022.01.07
Comments