Matplotlib 날짜 정밀도 및 에포크

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩은 Matplotlib 에서 날짜 정밀도와 에포크 (epoch) 를 처리하는 방법을 단계별로 보여주는 랩입니다. Matplotlib 는 이러한 날짜를 인식하고 부동 소수점 숫자로 변환하는 단위 변환기를 사용하여 .datetime 객체와 numpy.datetime64 객체를 사용할 수 있습니다. Matplotlib 3.3 이전에는 이 변환의 기본값으로 "0000-12-31T00:00:00" 이후의 일수를 나타내는 부동 소수점이 반환되었습니다. Matplotlib 3.3 부터는 "1970-01-01T00:00:00" 이후의 일수가 기본값입니다. 이는 최신 날짜에 대해 더 많은 해상도를 허용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 로딩이 완료될 때까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

필요한 패키지 가져오기

첫 번째 단계는 datetime, matplotlib.pyplot, numpy를 포함한 필요한 패키지를 가져오는 것입니다.

import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates

에포크를 이전 기본값으로 설정

다음 단계는 에포크를 이전 기본값, 즉 "0000-12-31T00:00:00" 이후의 일수로 설정하는 것입니다. 이는 mdates.set_epoch 메서드를 사용하여 수행됩니다.

mdates.set_epoch('0000-12-31T00:00:00')

datetime 을 matplotlib 날짜로 변환

이제 에포크가 설정되었으므로 datetime 객체를 mdates.date2num 함수를 사용하여 Matplotlib 날짜로 변환할 수 있습니다.

date1 = datetime.datetime(2000, 1, 1, 0, 10, 0, 12, tzinfo=datetime.timezone.utc)
mdate1 = mdates.date2num(date1)

날짜 왕복 변환 (Round-trip)

그런 다음 mdates.num2date 함수를 사용하여 날짜를 왕복 변환하여 변환이 정확한지 확인할 수 있습니다.

date2 = mdates.num2date(mdate1)

새로운 기본값으로 에포크 설정

마이크로초 정밀도로 최신 날짜를 사용하려면 에포크를 새로운 기본값으로 설정해야 합니다. 이는 "1970-01-01T00:00:00" 이후의 일수입니다.

mdates.set_epoch('1970-01-01T00:00:00')

새로운 에포크로 datetime 을 matplotlib 날짜로 변환

이제 에포크가 새로운 기본값으로 설정되었으므로 datetime 객체를 mdates.date2num 함수를 사용하여 Matplotlib 날짜로 변환할 수 있습니다.

date1 = datetime.datetime(2020, 1, 1, 0, 10, 0, 12, tzinfo=datetime.timezone.utc)
mdate1 = mdates.date2num(date1)

새로운 에포크로 날짜 왕복 변환

그런 다음 mdates.num2date 함수를 사용하여 날짜를 왕복 변환하여 변환이 정확한지 확인할 수 있습니다.

date2 = mdates.num2date(mdate1)

numpy.datetime64 를 matplotlib 날짜로 변환

numpy.datetime64 객체는 .datetime 객체보다 훨씬 더 큰 시간 공간에 대해 마이크로초 정밀도를 갖습니다. 그러나 현재 Matplotlib 시간은 마이크로초 해상도를 가지며 0000 에서 9999 까지의 연도만 포함하는 datetime 객체로만 다시 변환됩니다.

date1 = np.datetime64('2000-01-01T00:10:00.000012')
mdate1 = mdates.date2num(date1)

플로팅 (Plotting)

이 단계에서는 에포크가 플로팅에 미치는 영향을 보여줍니다. 이전 기본 에포크를 사용하면 내부 date2num 변환 중에 시간이 반올림되어 데이터에 점프가 발생했습니다.

mdates.set_epoch('0000-12-31T00:00:00')

x = np.arange('2000-01-01T00:00:00.0', '2000-01-01T00:00:00.000100', dtype='datetime64[us]')
xold = np.array([mdates.num2date(mdates.date2num(d)) for d in x])
y = np.arange(0, len(x))

fig, ax = plt.subplots(layout='constrained')
ax.plot(xold, y)
ax.set_title('Epoch: ' + mdates.get_epoch())
ax.xaxis.set_tick_params(rotation=40)
plt.show()

더 최근의 에포크를 사용하여 플로팅된 날짜의 경우, 플롯은 부드럽습니다.

mdates.set_epoch('1970-01-01T00:00:00')

fig, ax = plt.subplots(layout='constrained')
ax.plot(x, y)
ax.set_title('Epoch: ' + mdates.get_epoch())
ax.xaxis.set_tick_params(rotation=40)
plt.show()

요약

이 랩에서는 Matplotlib 에서 날짜 정밀도와 에포크를 처리하는 방법을 보여줍니다. mdates.set_epoch 메서드를 사용하여 에포크를 이전 기본값 또는 새 기본값으로 설정할 수 있습니다. 그런 다음 mdates.date2num 함수를 사용하여 datetime 또는 numpy.datetime64 객체를 Matplotlib 날짜로 변환하고, mdates.num2date 함수를 사용하여 날짜를 왕복 변환하여 변환이 정확한지 확인할 수 있습니다. 또한 플롯의 차이점을 관찰하기 위해 서로 다른 에포크로 데이터를 플로팅할 수도 있습니다.