본문 바로가기
Python/Pandas

Pandas 시계열 데이터 다루기

by 찐남 2021. 8. 20.
본 내용을 보기 전에 Python 사전 준비 및 Python 완전 기초를 먼저 이해하셔야 합니다.
본 포스팅은 pandas 공식 홈페이지를 기반으로 작성하였습니다.

 

이번 포스팅에서 사용할 실습 데이터는 Air quality data입니다. 아래 데이터를 활용하시면 됩니다.

 

air_quality_no2_long.csv
0.15MB

(air_quality_no2_long.csv: NO2 및 2.5 마이크로미터 미만의 미립자 물질에 ​​대한 대기 품질 데이터로, openaq에서 제공하고 py-openaq 패키지를 사용하여 다운로드합니다. 파리, 앤트워프 및 런던에 있는 측정 스테이션 FR04014, BETR801 및 런던 웨스트민스터에 대한 NO2 값을 제공합니다.)

 

import pandas as pd
import matplotlib.pyplot as plt 

air_quality = pd.read_csv("D:/python_exer/air_quality_no2_long.csv")
air_quality = air_quality.rename(columns = {"date.utc" : "datetime"})
air_quality.head()

 

 

 

 



 

 

1. 시계열 데이터 다루기

 

1.1. pandas datetime 속성 사용

 

1.1.1. 일반 텍스트 대신 datetime 개체로 datetime 열의 날짜 다루기

 

air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])
air_quality["datetime"]

 

 

처음에 datetime의 값은 문자열이며, datetime 형식의 데이터 작업을 제공하지 않습니다(예: 연도, 요일 추출 등). to_datetime 함수를 적용하여 pandas는 문자열을 해석하고 이를 datetime(예: datetime64[ns, UTC]) 객체로 변환합니다. pandas에서는 표준 라이브러리의 datetime.datetime과 유사한 이러한 datetime 객체를 pandas.Timestamp라고 부릅니다. (Note: 많은 데이터 세트가 열 중 하나에 날짜/시간 정보를 포함하기 때문에 pandas.read_csv() 및 pandas.read_json()과 같은 pandas 입력 함수는 parse_dates 매개변수를 사용하여 데이터를 읽을 때 날짜로 변환할 열 목록(tiemstamp)이 있습니다. 

 

pd.read_csv("../data/air_quality_no2_long.csv", parse_dates=["datetime"])

 

이 pandas.Timestamp 객체가 유용한 이유는 아래의 몇 가지 사례를 통해 설명하겠습니다.

 

▶ 우리가 실습하고 있는 시계열 데이터 세트의 시작 날짜와 종료 날짜 구하기 

 

air_quality["datetime"].min(), air_quality["datetime"].max()

 

 

날짜 시간에 pandas.Timestamp를 사용하면 날짜 정보로 계산하고 비교할 수 있습니다. 따라서 이것을 사용하여 시계열의 길이를 얻을 수 있습니다. 

 

air_quality["datetime"].max() - air_quality["datetime"].min()

 

 

결과는 표준 Python 라이브러리의 datetime.timedelta와 유사하고 기간을 정의하는 pandas.Timedelta 객체입니다.

 

1.1.2. 측정 월만 포함한 새 열 추가하기

 

air_quality["month"] = air_quality["datetime"].dt.month
air_quality.head()

 

 

날짜에 Timestamp 개체를 사용하면 pandas에서는 많은 시간 관련 속성을 제공합니다. 예를 들어, 월뿐만 아니라 연도, 주중, 분기 등 이러한 모든 속성은 dt 접근자로 액세스 할 수 있습니다.

 

1.1.3. 각 측정 위치에 대한 요일별 평균 NO2 농도 구하기

 

air_quality.groupby([air_quality["datetime"].dt.weekday, "location"])["value"].mean()

 

 

 

2021.08.17 - [Python/Pandas 기초익히기] - Pandas 활용 요약통계량 생성하기에서 groupby가 제공하는 split-apply-combine 패턴을 배웠습니다. 이번 포스팅에서는 각 요일 및 각 측정 위치에 대해 주어진 통계(예: 평균 NO2)를 계산하려고 합니다. 요일별 그룹화를 위해 dt 접근자에서도 액세스 할 수 있는 pandas Timestamp의 datetime 속성 weekday(월요일=0 및 일요일=6)를 사용합니다. 위치와 요일 모두에 대한 그룹화를 수행하여 이러한 각 조합에 대한 평균 계산을 분할할 수 있습니다(주의: 이 예에서 매우 짧은 시계열로 작업하기 때문에 분석은 장기적인 대표 결과를 제공하지 않습니다!).

 



 

1.1.4. 모든 관측소에 대한 시간대별 평균 NO2 수치 변화 패턴 나타내기 

 

fig, axs = plt.subplots(figsize=(12, 4))
air_quality.groupby(air_quality["datetime"].dt.hour)["value"].mean().plot(kind='bar', rot=0, ax=axs)
plt.xlabel("Hour of the day")
plt.ylabel("$NO_2 (µg/m^3)$")

 

 

이전의 경우와 유사하게 하루의 각 시간에 대해 평균 NO2를 계산하고 분할-적용-결합 접근 방식을 다시 사용할 수 있습니다. 이 경우 dt 접근자도 액세스 할 수 있는 pandas Timestamp의 datetime 속성 hour를 사용합니다.

 

1.2. 인덱스로서의 datetime

 

2021.08.18 - [Python/Pandas 기초익히기] - Pandas 테이블 구조 변경 방법에서 각 측정 위치를 별도의 열로 사용하여 데이터 테이블을 재구성하기 위해 pibot() 함수를 사용했습니다. 

 

no_2 = air_quality.pivot(index="datetime", columns="location", values="value")
no_2.head()

 

 

(Note: 데이터를 피벗함으로써 날짜/시간 정보가 테이블의 인덱스가 되었습니다. 일반적으로 열을 인덱스로 설정하는 것은 set_index 함수로 가능합니다.)

 

날짜/시간 인덱스(예: DatetimeIndex)로 작업하면 강력한 기능을 제공합니다. 예를 들어 시계열 속성을 가져오기 위해 dt 접근자가 필요하지 않지만 이러한 속성을 인덱스에서 직접 사용할 수 있습니다. 

 

no_2.index.year, no_2.index.weekday

 

 

몇 가지 다른 장점은 기간의 편리한 부분 집합 또는 플롯에 적응된 시간 척도입니다. 이를 데이터에 적용해 보겠습니다.

 

1.2.1. 5월 20일부터 5월 21일 말까지 관측소에서 측정된 NO2 값 그리기

 

no_2["2019-05-20":"2019-05-21"].plot()

 

 

datetime으로 구문 분석하는 문자열을 제공하여 DatetimeIndex에서 데이터의 특정 하위 집합을 선택할 수 있습니다. 

 

1.3. 시계열을 다른 빈도로 리샘플링하기

 

1.3.1. 현재 시간별 시계열 값을 각 스테이션의 월별 최댓값 계산하기

 

monthly_max = no_2.resample("M").max()
monthly_max

 

 

날짜/시간 인덱스가 있는 시계열 데이터에 대한 매우 강력한 방법은 시계열을 다른 빈도로 resample()하는 기능입니다(예: 두 번째 데이터를 5분 데이터로 변환).

 

resample() 함수는 groupby 작업과 유사합니다. 

 

  • 목표 빈도를 정의하는 문자열(예: M, 5H,…)을 사용하여 시간 기반 그룹화를 제공합니다. 
  • 평균, 최댓값과 같은 집계 함수가 필요합니다. 

 

정의된 경우 시계열의 빈도는 freq 속성에 의해 제공됩니다.

 

monthly_max.index.freq

 

1.3.2. 각 스테이션의 일일 평균 NO2 값 그리기

 

no_2.resample("D").mean().plot(style="-o", figsize=(10, 5))

 

 

2. Remeber !

 

  • 유효한 날짜 문자열은 to_datetime 함수를 사용하거나 읽기 함수의 일부로 datetime 객체로 변환할 수 있습니다.
  • pandas의 날짜/시간 개체는 dt 접근자를 사용하여 계산, 논리 연산 및 편리한 날짜 관련 속성을 지원합니다.
  • DatetimeIndex는 이러한 날짜 관련 속성을 포함하고 편리한 슬라이싱을 지원합니다. 
  • Resample은 시계열의 빈도를 변경하는 강력한 방법입니다.

 

 

 

반응형

'Python > Pandas' 카테고리의 다른 글

Pandas 객체 생성  (0) 2021.09.12
Pandas 텍스트 데이터 다루기  (0) 2021.08.21
Pandas 활용 테이블 결합 방법  (0) 2021.08.19
Pandas 테이블 구조 변경 방법  (0) 2021.08.18
Pandas 활용 요약통계량 생성하기  (0) 2021.08.17

댓글