Pandas Dataframe Pivot и переиндексация n временных рядов - PullRequest
0 голосов
/ 28 мая 2018

У меня есть кадр данных pandas, содержащий n временных рядов в одном и том же столбце Datetime, каждый из которых связан с другим 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 голосов
/ 28 мая 2018

Я считаю, что необходимо преобразовать столбец в datetime и floor на 30 minute s на floor, последний pivot и add_prefix:

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
...