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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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属性を見ると確認できる。

1
2
ts.index.is_unique
# False

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

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

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

1
2
3
4
5
6
7
8
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を指定すると良い。

01
02
03
04
05
06
07
08
09
10
11
12
13
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