はじめに
この手順に従った実験では、Matplotlib における日付の精度とエポックの扱い方を示します。Matplotlib は、これらの日付を認識して浮動小数点数に変換する単位変換機を使用して、.datetimeオブジェクトとnumpy.datetime64オブジェクトと共に動作することができます。Matplotlib 3.3 以前では、この変換のデフォルトは、「0000-12-31T00:00:00」からの日数を返す浮動小数点数でした。Matplotlib 3.3 以降では、デフォルトは「1970-01-01T00:00:00」からの日数です。これにより、現代の日付に対してより高い解像度が可能になります。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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 日付に変換する
エポックが設定されたので、mdates.date2num関数を使用して、datetimeオブジェクトを Matplotlib 日付に変換することができます。
date1 = datetime.datetime(2000, 1, 1, 0, 10, 0, 12, tzinfo=datetime.timezone.utc)
mdate1 = mdates.date2num(date1)
日付を元に戻す
その後、変換が正確であることを確認するために、mdates.num2date関数を使用して日付を元に戻すことができます。
date2 = mdates.num2date(mdate1)
エポックを新しいデフォルトに設定する
マイクロ秒精度の最新の日付を使用するには、エポックを新しいデフォルトに設定する必要があります。これは、「1970-01-01T00:00:00」からの日数です。
mdates.set_epoch('1970-01-01T00:00:00')
新しいエポックで datetime を Matplotlib 日付に変換する
エポックが新しいデフォルトに設定されたので、mdates.date2num関数を使用して、datetimeオブジェクトを 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)
プロット
このステップでは、エポックがプロットにどのように影響するかを示します。古いデフォルトのエポックでは、内部の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関数を使用して日付を元に戻すことができます。また、異なるエポックでデータをプロットして、プロットの違いを観察することもできます。