일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- AWS
- 다나와
- DANAWA
- analyzing
- python
- matplotlib
- Project
- data
- Crawling
- ECS
- webcrawling
- 애자일
- pandas
- TypeScript
- 크롤링
- data analyze
- 자바스크립트
- keras
- opencv
- instance
- Scrum
- Method
- tensorflow
- adaptive life cycle
- angular
- visualizing
- 프로젝트
- javascript
- algorithm
- Agile
Archives
- Today
- Total
LiJell's 성장기
17.python_datetime_expression 본문
반응형
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