Pandas Dataframe Pivot和reindex n timeseries

时间:2018-05-28 08:40:17

标签: python pandas dataframe time-series reindex

我有一个pandas数据帧,在同一个Datetime列中包含n个时间序列,每个时间序列与不同的Id相关联,并且相应的值相关联。我想转动表并重新索引到最近的时间戳。请注意,可能存在缺少时间戳的情况,如在Id-3中,在这种情况下,该值将需要变为NaN。

Datetime       Id Value
5-26-17 8:00   1  2.3
5-26-17 8:30   1  4.5
5-26-17 9:00   1  7
5-26-17 9:30   1  8.1
5-26-17 10:00  1  7.9
5-26-17 10:30  1  3.4
5-26-17 11:00  1  2.1
5-26-17 11:30  1  1.8
5-26-17 12:00  1  0.4
5-26-17 8:02   2  2.6
5-26-17 8:32   2  4.8
5-26-17 9:02   2  7.3
5-26-17 9:32   2  8.4
5-26-17 10:02  2  8.2
5-26-17 10:32  2  3.7
5-26-17 11:02  2  2.4
5-26-17 11:32  2  2.1
5-26-17 12:02  2  0.7
5-26-17 8:30   3  4.5
5-26-17 9:00   3  7
5-26-17 9:30   3  8.1
5-26-17 10:00  3  7.9
5-26-17 10:30  3  3.4
5-26-17 11:00  3  2.1
5-26-17 11:30  3  1.8
5-26-17 12:00  3  0.4

预期结果:

Datetime      Id-1 Id-2 Id-3
5-26-17 8:00  2.3  2.6  NaN
5-26-17 8:30  4.5  4.8  4.5
5-26-17 9:00  7    7.3  7
5-26-17 9:30  8.1  8.4  8.1
5-26-17 10:00 7.9  8.2  7.9
5-26-17 10:30 3.4  3.7  3.4
5-26-17 11:00 2.1  2.4  2.1
5-26-17 11:30 1.8  2.1  1.8
5-26-17 12:00 0.4  0.7  0.4

你会怎么做?

1 个答案:

答案 0 :(得分:1)

我认为需要在floorpivotadd_prefix之后按30 minute转换列到日期时间和楼层:

df['Datetime'] = pd.to_datetime(df['Datetime']).dt.floor('30T')
df = df.pivot('Datetime','Id','Value').add_prefix('Id-')
print (df)
Id                   Id-1  Id-2  Id-3
Datetime                             
2017-05-26 08:00:00   2.3   2.6   NaN
2017-05-26 08:30:00   4.5   4.8   4.5
2017-05-26 09:00:00   7.0   7.3   7.0
2017-05-26 09:30:00   8.1   8.4   8.1
2017-05-26 10:00:00   7.9   8.2   7.9
2017-05-26 10:30:00   3.4   3.7   3.4
2017-05-26 11:00:00   2.1   2.4   2.1
2017-05-26 11:30:00   1.8   2.1   1.8
2017-05-26 12:00:00   0.4   0.7   0.4

另一种解决方案是resample使用mean

df['Datetime'] = pd.to_datetime(df['Datetime'])

df = (df.set_index('Datetime')
        .groupby('Id')
        .resample('30T')['Value']
        .mean().unstack(0)
        .add_prefix('Id-'))

print (df)
Id                   Id-1  Id-2  Id-3
Datetime                             
2017-05-26 08:00:00   2.3   2.6   NaN
2017-05-26 08:30:00   4.5   4.8   4.5
2017-05-26 09:00:00   7.0   7.3   7.0
2017-05-26 09:30:00   8.1   8.4   8.1
2017-05-26 10:00:00   7.9   8.2   7.9
2017-05-26 10:30:00   3.4   3.7   3.4
2017-05-26 11:00:00   2.1   2.4   2.1
2017-05-26 11:30:00   1.8   2.1   1.8
2017-05-26 12:00:00   0.4   0.7   0.4