如何对齐熊猫时间序列

时间:2019-01-11 13:56:43

标签: pandas time-series

假设我们具有以下两个时间序列ts_1ts_2

d = {'date': ['2018-01-01',
              '2018-01-02 12:00:00.000',
              '2018-01-02 13:00:00.000',
              '2018-01-03',
              '2018-01-04'],
        'value': [9, 11, 12, 11, 8]}
df = pd.DataFrame(d)
df['date'] = pd.to_datetime(df['date'])
ts_1 = pd.Series(df['value'].values, index=df['date']).resample('D').count()
greater10 = df[df['value']>10]
ts_2 = pd.Series(greater10['value'].values, index=greater10['date']).resample('D').count()

很显然,两个时间序列都没有相同的起点和终点(因此长度也相同),这正是我所需要的。

如何对齐起点和终点的最大值?缺少的值应用0填充。

2 个答案:

答案 0 :(得分:2)

我认为,如果需要时间序列的第一个和最后一个值,则需要iloc concat

df = pd.concat([ts_1.iloc[[0, -1]], 
                ts_2.iloc[[0, -1]]], axis=1, keys=('ts1','ts2')).fillna(0)
print (df)
            ts1  ts2
date                
2018-01-01  1.0  0.0
2018-01-02  0.0  2.0
2018-01-03  0.0  1.0
2018-01-04  1.0  0.0

如果只需要对齐时间序列:

df = pd.concat([ts_1, ts_2], axis=1, keys=('ts1','ts2')).fillna(0)
print (df)
            ts1  ts2
date                
2018-01-01    1  0.0
2018-01-02    2  2.0
2018-01-03    1  1.0
2018-01-04    1  0.0

另一种解决方案是使用Series.align

s11, s12 = ts_1.align(ts_2, fill_value=0)
print (s11)
date
2018-01-01    1
2018-01-02    2
2018-01-03    1
2018-01-04    1
Freq: D, dtype: int64

print (s12)
date
2018-01-01    0.0
2018-01-02    2.0
2018-01-03    1.0
2018-01-04    0.0
Freq: D, dtype: float64

s21, s22 = ts_2.align(ts_1, fill_value=0)
print (s21)
date
2018-01-01    0.0
2018-01-02    2.0
2018-01-03    1.0
2018-01-04    0.0
Freq: D, dtype: float6

print (s22)
date
2018-01-01    1
2018-01-02    2
2018-01-03    1
2018-01-04    1
Freq: D, dtype: int64

答案 1 :(得分:1)

您应该可以从documentation进行

result = pd.concat([ts_1, ts_2], axis=1, join_axes=[ts_1.index])

假设您希望将索引保留在ts_1