У меня есть много данных о двух переменных Var1 и Var2 в разных контекстах (пространство и время), которые я хочу просматривать через регулярные интервалы времени (этот интервал времени зависит от имени) с постоянной частотой (скажем, 1 секунда)).
Вот мой фрейм данных:
Name Date DatetimeUtc Var1 Var2 StartTimeWanted EndTimeWanted
Zeus 2018-01-02 2018-01-02 16:20:00.0840 1.0 2.5 2018-01-02 16:20:00 2018-01-02 16:30:00
Zeus 2018-01-04 2018-01-04 16:20:01.1470 0.1 1.7 2018-01-04 16:20:00 2018-01-04 16:30:00
Zeus 2018-01-04 2018-01-04 16:20:01.1490 1.4 0.1 2018-01-04 16:20:00 2018-01-04 16:30:00
Zeus 2018-01-04 2018-01-04 16:28:00.0010 1.4 2.9 2018-01-04 16:20:00 2018-01-04 16:30:00
....
Iris 2018-01-02 2018-01-02 16:21:32.0840 1.2 4.1 2018-01-02 16:00:00 2018-01-02 16:45:00
Iris 2018-01-06 2018-01-06 16:22:00.5487 4.1 0.1 2018-01-06 16:00:00 2018-01-06 16:45:00
Iris 2018-01-06 2018-01-06 16:22:00.9784 4.5 4.1 2018-01-06 16:00:00 2018-01-06 16:45:00
....
Я хотел бы следующий вывод:
Name Date BucketID AverageVar1 AverageVar2
Zeus 2018-01-02 16:20:00 1.0 2.5
Zeus 2018-01-02 16:20:01 NaN NaN
Zeus 2018-01-02 16:20:02 NaN NaN
...
Zeus 2018-01-02 16:29:59 NaN NaN
Zeus 2018-01-04 16:20:00 NaN NaN
Zeus 2018-01-04 16:20:01 0.75 0.9
...
Zeus 2018-01-04 16:28:00 1.4 2.9
...
Zeus 2018-01-04 16:29:59 NaN NaN
Iris 2018-01-02 16:00:00 NaN NaN
Iris 2018-01-02 16:00:01 NaN NaN
...
Iris 2018-01-02 16:21:32 1.2 4.1
...
Iris 2018-01-02 16:44:59 NaN NaN
Iris 2018-01-06 16:00:00 NaN NaN
...
Iris 2018-01-06 16:22:00 4.3 2.1
Iris 2018-01-06 16:22:01 NaN NaN
...
Iris 2018-01-06 16:44:59 NaN NaN
И в идеале я хотел бы заменить NaN на самые последние значениякогда это возможно:
Name Date BucketID AverageVar1 AverageVar2
Zeus 2018-01-02 16:20:00 1.0 2.5
Zeus 2018-01-02 16:20:01 1.0 2.5
Zeus 2018-01-02 16:20:02 1.0 2.5
...
Zeus 2018-01-02 16:29:59 1.0 2.5
Zeus 2018-01-04 16:20:00 NaN NaN
Zeus 2018-01-04 16:20:01 0.75 0.9
...
Zeus 2018-01-04 16:28:00 1.4 2.9
...
Zeus 2018-01-04 16:29:59 1.4 2.9
Iris 2018-01-02 16:00:00 NaN NaN
Iris 2018-01-02 16:00:01 NaN NaN
...
Iris 2018-01-02 16:21:32 1.2 4.1
...
Iris 2018-01-02 16:44:59 1.2 4.1
Iris 2018-01-06 16:00:00 NaN NaN
...
Iris 2018-01-06 16:22:00 4.3 2.1
Iris 2018-01-06 16:22:01 4.3 2.1
...
Iris 2018-01-06 16:44:59 4.3 2.1
Примечание: я хотел бы использовать только векторизованные функции, а не циклы, потому что объем данных очень высок.
Я пробовал:
data_frame.set_index("DatetimeUtc").groupby(["Name", "Date", pd.Grouper(key="DatetimeUtc", freq="1s")])["Var1", "Var2"].mean().fillna(method="bfill").reset_index()
Это работает довольно хорошо, но BucketID начинается с первого DatetimeUtc группы, а не StartTimeWanted.То же самое для конца ... Но есть большая проблема: контейнеры не создаются, когда вокруг нет данных (другими словами, в выводе нет NaN).
Итак, я попытался:
data_frame.set_index("DatetimeUtc").groupby(["Name", "Date"])["Var1", "Var2"].resample("1s").mean().fillna(method="bfill").reset_index()
И это решает проблему не создаваемых сегментов, когда вокруг нет данных (теперь у меня есть NaN, как я и хотел).
Тем не менее, у меня все еще есть проблема, чтобы заставить повторную выборку начинаться в StartTimeWanted и заканчиваться в EndTimeWanted.Я понятия не имею, как использовать эти значения.Я частично решил проблему для EndTimeWanted, отбросив данные, где BucketID находится после EndTimeWanted.Но создание сегментов между StartTimeWanted и моим первым datetime для каждой группы кажется более сложным ...