데이터를 정제하다 보면, 시계열 자료를 다룰 일이 많다.
datetime이라는 패키지만 따로 공부해야 할 정도로 Python의 datetime 타입을 다루는 방식은 가지각색이다.
그 중에서도 오늘은 pandas DataFrame의 DateTime을 indexing하는 방식을 포스팅하려고 한다.
Slicing
DataFrame의 loc 메서드를 사용하면 SQL과 비슷한 방식의 직관적인 indexing이 가능하다.
가장 직관적이고 쉬운 만큼 많이 활용하는 방식이다.
아래와 같은 간단한 DataFrame을 생성한다. 2021년 1월 1일부터 80일간의 데이터를 생성하였다.
import numpy as np
import pandas as pd
from datetime import datetime as dt
df = pd.DataFrame({'DateTime': pd.date_range(dt(2021,1,1),freq = 'D', periods=80),\
'Random': np.random.random_sample(80)})
DateTime Random
0 2021-01-01 0.136629
1 2021-01-02 0.533775
2 2021-01-03 0.750567
3 2021-01-04 0.013737
4 2021-01-05 0.033789
.. ... ...
75 2021-03-17 0.672409
76 2021-03-18 0.376567
77 2021-03-19 0.871272
78 2021-03-20 0.946325
79 2021-03-21 0.838278
[80 rows x 2 columns]
2021년 3월 이후의 데이터만 조회하기
print(df.loc[df["DateTime"] >= '2021-03'])
DateTime Random
59 2021-03-01 0.500865
60 2021-03-02 0.348939
61 2021-03-03 0.436305
62 2021-03-04 0.848968
63 2021-03-05 0.684953
64 2021-03-06 0.255811
65 2021-03-07 0.658426
66 2021-03-08 0.460611
67 2021-03-09 0.023758
68 2021-03-10 0.546162
69 2021-03-11 0.195894
70 2021-03-12 0.456299
71 2021-03-13 0.825969
72 2021-03-14 0.478156
73 2021-03-15 0.305577
74 2021-03-16 0.684497
75 2021-03-17 0.691714
76 2021-03-18 0.748792
77 2021-03-19 0.933899
78 2021-03-20 0.992072
79 2021-03-21 0.070519
2021년 2월 13일 이후의 데이터만 조회하기
df[df["DateTime"] > '2021-02-13']
DateTime Random
44 2021-02-14 0.327010
45 2021-02-15 0.404795
46 2021-02-16 0.558738
47 2021-02-17 0.329003
48 2021-02-18 0.682903
49 2021-02-19 0.756436
50 2021-02-20 0.404759
51 2021-02-21 0.261877
52 2021-02-22 0.043162
53 2021-02-23 0.049204
54 2021-02-24 0.915272
55 2021-02-25 0.392121
56 2021-02-26 0.418985
57 2021-02-27 0.783094
58 2021-02-28 0.342368
59 2021-03-01 0.561959
60 2021-03-02 0.591314
61 2021-03-03 0.160281
62 2021-03-04 0.519945
63 2021-03-05 0.562511
64 2021-03-06 0.172544
65 2021-03-07 0.575981
66 2021-03-08 0.498039
67 2021-03-09 0.650136
68 2021-03-10 0.693250
69 2021-03-11 0.438567
70 2021-03-12 0.324218
71 2021-03-13 0.882504
72 2021-03-14 0.167982
73 2021-03-15 0.442913
74 2021-03-16 0.945495
75 2021-03-17 0.348496
76 2021-03-18 0.513553
77 2021-03-19 0.191279
78 2021-03-20 0.155175
79 2021-03-21 0.929694
datetime package를 활용하여 원하는 연 / 월 / 일에 해당하는 데이터 추출하기
여러 해의 데이터가 있을 때, 년도에 관련 없이 원하는 월에 해당하는 데이터만 뽑아내고 싶을 때가 있다.
예를 들어 2020년과 2021년의 데이터가 있다고 할 때, 6월의 데이터만 추출하고 싶을 때 아래와 같이 slicing을 활용한다면 굉장히 비효율적인 일일 것이다.
print(df.loc[((df["DateTime"]>= '2020-06-01') & (df["DateTime"] <= '2020-06-30'))\
| ((df["DateTime"]>= '2021-06-01') & (df["DateTime"] <= '2021-06-30'))])
DateTime Random
152 2020-06-01 0.276299
153 2020-06-02 0.949132
154 2020-06-03 0.636337
155 2020-06-04 0.523407
156 2020-06-05 0.988907
157 2020-06-06 0.112210
158 2020-06-07 0.547079
159 2020-06-08 0.349816
160 2020-06-09 0.694426
161 2020-06-10 0.487902
162 2020-06-11 0.014898
163 2020-06-12 0.052412
164 2020-06-13 0.124713
165 2020-06-14 0.449270
166 2020-06-15 0.163247
167 2020-06-16 0.221664
168 2020-06-17 0.379580
169 2020-06-18 0.134454
170 2020-06-19 0.945613
171 2020-06-20 0.527595
172 2020-06-21 0.888912
173 2020-06-22 0.755205
174 2020-06-23 0.686758
175 2020-06-24 0.829723
176 2020-06-25 0.557603
177 2020-06-26 0.474822
178 2020-06-27 0.163030
179 2020-06-28 0.474938
180 2020-06-29 0.045235
181 2020-06-30 0.047138
517 2021-06-01 0.803399
518 2021-06-02 0.944928
519 2021-06-03 0.296672
520 2021-06-04 0.982899
521 2021-06-05 0.049962
522 2021-06-06 0.702588
523 2021-06-07 0.597281
524 2021-06-08 0.782726
525 2021-06-09 0.650968
526 2021-06-10 0.294101
527 2021-06-11 0.793058
528 2021-06-12 0.836886
529 2021-06-13 0.239883
530 2021-06-14 0.799771
531 2021-06-15 0.921098
532 2021-06-16 0.505465
533 2021-06-17 0.756339
534 2021-06-18 0.256206
535 2021-06-19 0.912523
536 2021-06-20 0.680952
537 2021-06-21 0.097247
538 2021-06-22 0.708108
539 2021-06-23 0.096603
540 2021-06-24 0.008056
541 2021-06-25 0.726431
542 2021-06-26 0.477850
543 2021-06-27 0.781262
544 2021-06-28 0.423455
545 2021-06-29 0.308911
546 2021-06-30 0.449629
이럴 때, slicing보다는 pandas datetime datatype에 할당된 메서드인 dt를 활용하면 좋다.
예를 들어 위와 같이 6월만 골라내보자.
print(df.loc[df["DateTime"].dt.month == 6])
DateTime Random
152 2020-06-01 0.060411
153 2020-06-02 0.300481
154 2020-06-03 0.551125
155 2020-06-04 0.215049
156 2020-06-05 0.960095
157 2020-06-06 0.193579
158 2020-06-07 0.642723
159 2020-06-08 0.856843
160 2020-06-09 0.703524
161 2020-06-10 0.072231
162 2020-06-11 0.187067
163 2020-06-12 0.707267
164 2020-06-13 0.542008
165 2020-06-14 0.865080
166 2020-06-15 0.792237
167 2020-06-16 0.642721
168 2020-06-17 0.352192
169 2020-06-18 0.833916
170 2020-06-19 0.559139
171 2020-06-20 0.470491
172 2020-06-21 0.038082
173 2020-06-22 0.960411
174 2020-06-23 0.608511
175 2020-06-24 0.955650
176 2020-06-25 0.177397
177 2020-06-26 0.367123
178 2020-06-27 0.006216
179 2020-06-28 0.591656
180 2020-06-29 0.230432
181 2020-06-30 0.628306
517 2021-06-01 0.954987
518 2021-06-02 0.110617
519 2021-06-03 0.596261
520 2021-06-04 0.993965
521 2021-06-05 0.082618
522 2021-06-06 0.950952
523 2021-06-07 0.229196
524 2021-06-08 0.286054
525 2021-06-09 0.837238
526 2021-06-10 0.517809
527 2021-06-11 0.000841
528 2021-06-12 0.525158
529 2021-06-13 0.199933
530 2021-06-14 0.160257
531 2021-06-15 0.565423
532 2021-06-16 0.147706
533 2021-06-17 0.074531
534 2021-06-18 0.067226
535 2021-06-19 0.063673
536 2021-06-20 0.655683
537 2021-06-21 0.259257
538 2021-06-22 0.917946
539 2021-06-23 0.901809
540 2021-06-24 0.971959
541 2021-06-25 0.955549
542 2021-06-26 0.295816
543 2021-06-27 0.397660
544 2021-06-28 0.848376
545 2021-06-29 0.031158
546 2021-06-30 0.355545
dt.month라는 메서드를 사용해, 연도에 관련없이 6월에 해당하는 데이터만 깔끔하게 indexing했다.
'Python > pandas' 카테고리의 다른 글
같은 column에서 numeric 자료만 골라내기 (0) | 2021.12.15 |
---|---|
Pandas에서 결측치를 채워넣는 여러 방법들 (0) | 2021.07.13 |
Pandas concat 함수 응용하기 (0) | 2021.07.05 |