pandasで扱う時系列データ(シリーズやデータフレームのインデックス)は、必ずしも一意なデータになっているとは限らない。

場合によっては一つのタイムスタンプに対して、複数のデータを持たせることもあるだろう。

そのような重複した時系列データを扱う例を今回は紹介していく。

まず、次のようなデータがあるとしよう。

import pandas as pd
import numpy as np

dates = pd.DatetimeIndex([
    '10/1/2019', '10/2/2019', '10/2/2019',
    '10/2/2019', '10/3/2019'
])

ts = pd.Series(np.arange(5), index=dates)

# 2019-10-01    0
# 2019-10-02    1
# 2019-10-02    2
# 2019-10-02    3
# 2019-10-03    4
# dtype: int64

時系列が一意かどうかを確認する

インデックスが一意(ユニーク)でないことは、is_unique属性を見ると確認できる。

ts.index.is_unique
# False

重複した時系列を持つデータを参照する

重複した時系列を持つデータを参照する場合、タイムスタンプが重複しているかどうかで、得られるデータの形式は変わる。

下記のとおり、重複していない場合はスカラー値が戻され、重複している場合はデータの集合が戻される。

ts['10/3/2019'] # 重複していない
# 4

ts['10/2/2019'] # 重複している
# 2019-10-02    1
# 2019-10-02    2
# 2019-10-02    3
# dtype: int64

重複した時系列を持つデータを集約する

このようなデータを集約する場合は、groupby関数を使用し、level=0を指定すると良い。

grouped  = ts.groupby(level=0)

grouped.sum()
# 2019-10-01    0
# 2019-10-02    6
# 2019-10-03    4
# dtype: int64

grouped.mean()
# 2019-10-01    0
# 2019-10-02    2
# 2019-10-03    4
# dtype: int64