如何对每个组的边界重新采样数据?

时间:2019-07-10 15:11:33

标签: python pandas date datetime

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

0 个答案:

没有答案