首页 > 解决方案 > 在向前填充(填充)值时重新采样 Pandas 数据帧

问题描述

我有一个数据框,其中一个片段看起来像这样

    Time                    Temperature
19  2019-01-01 11:48:51     23.798
20  2019-01-01 11:48:53     23.832
21  2019-01-01 11:48:54     NaN
22  2019-01-01 11:48:55     23.817
23  2019-01-01 11:48:56     NaN

我想将其重新采样为“2S”,同时确保最后一个测量值将替换任何 NaN。

df.resample('2S', on='Time').mean().ffill()

结果的片段如下所示

                        Temperature
Time            
2019-01-01 11:48:52     23.832
2019-01-01 11:48:54     23.817
2019-01-01 11:48:56     23.809

注意时间戳 t=54s 处的值。我想要的是 t=53s 的温度 23.832,因为这是该时间戳的最后记录值。相反,它填充 t=55s 的值

编辑1: 回复后,我尝试了以下方法:

df.ffill().resample('2S', on='Time').first()

但这给出了以下结果,其中新的 t=52s 等于旧的 t=t=53s,这不是我所追求的行为......

                        Temperature
Time            
2019-01-01 11:48:50     23.798
2019-01-01 11:48:52     23.832
2019-01-01 11:48:54     23.832
2019-01-01 11:48:56     23.817

编辑2: 为了更容易理解,这是我想要的输出。我不在乎它是在奇数秒还是偶数秒采样。

                        Temperature
Time            
2019-01-01 11:48:52     23.798
2019-01-01 11:48:54     23.832
2019-01-01 11:48:56     23.817

标签: pythonpandasdataframe

解决方案


编辑#3:

idx = df.resample('2S').asfreq().index
df.reindex(df.index.union(idx)).ffill().resample('2S').asfreq()

输出:

                     Temperature
Time                            
2019-01-01 11:48:50          NaN
2019-01-01 11:48:52       23.798
2019-01-01 11:48:54       23.832
2019-01-01 11:48:56       23.817

编辑#2:

idx = df.resample('2S').asfreq().index
df.reindex(df.index.union(idx)).bfill().resample('2S').first()

输出:

                     Temperature
Time                            
2019-01-01 11:48:50       23.798
2019-01-01 11:48:52       23.832
2019-01-01 11:48:54       23.817
2019-01-01 11:48:56          NaN

编辑:

df.reindex(df.index.union(df.resample('2S').asfreq().index))\
  .interpolate().resample('2S').asfreq()

输出:

                     Temperature
Time                            
2019-01-01 11:48:50          NaN
2019-01-01 11:48:52      23.8150
2019-01-01 11:48:54      23.8245
2019-01-01 11:48:56      23.8170

你想在奇数秒还是偶数秒重新采样两秒?

df.ffill().resample('2S', on='Time', base=1).mean()

输出:

                    Temperature
Time                            
2019-01-01 11:48:51       23.798
2019-01-01 11:48:53       23.832
2019-01-01 11:48:55       23.817

或者只是偶数秒:

df.ffill().resample('2S', on='Time').mean()

输出:

                     Temperature
Time                            
2019-01-01 11:48:50      23.7980
2019-01-01 11:48:52      23.8320
2019-01-01 11:48:54      23.8245
2019-01-01 11:48:56      23.8170

推荐阅读