我有很多关于两个变量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和我的第一个日期时间之间创建存储桶似乎更加复杂...