在向前填充(填充)值的同时对Pandas数据框进行重新采样

时间:2019-03-13 14:26:07

标签: python pandas dataframe

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

    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

2 个答案:

答案 0 :(得分:1)

编辑#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

答案 1 :(得分:0)

编辑后使用,而不是第一个。可能与样本数据无关紧要,但是如果您在2秒钟内有多个记录,则可以确保您使用的是最新记录。

重采样时有一个选项可以指定垃圾箱的哪个边缘来标记数据。 S的默认值为左-因此是2秒时间段的开始。我相信更改为right可以满足您的需求。

df.resample('2S', on='Time', label='right').last().ffill()

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