添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

  • 벡터 연산가능

    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()
    # 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
    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)
    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['일자'] 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']]
    • 월화수목금토 순으로 재배치 해야 함
    • 아직까지는 정렬로 배치 안됨, 색인으로 처리해야 함