【Pandas时间序列处理】Resample踩坑实录
Long story short,使用resample对一个含传感器id列的数据集进行重采样时遇到了无法保持id列不参与resample后的数学运算的问题,记录本人的尝试过程及最终解决方法。
可行方案
先来说最终的解决方案:
对传感器id列使用 groupby()
函数再对时间序列进行 resample()
,避免了sum()
等函数对传感器id列的处理。代码如下:
# 传感器id列名: dec
# 指定sum()函数只对数值型(numeric_only)的cols操作
data = data.groupby("dec").resample('5min').sum(numeric_only=True)
Vegitable_dog的踩坑合集
1. 直接将传感器id设置为index
由于事先已将时间列作为datetime index
,相当于为dataframe设置了双重index,导致后续进行resample
时出错。
其实如果后续没有再对时间序列的处理的话,可以直接将索引设置为传感器id列(注意要先用reset_index()
,直接声明index='dec'
会变成双重索引),再把datetime列变回常规列。在重采样时传递参数resample(on='datatime_col_name')
时指定对应的datetime列即可。
2. 重采样后使用agg分别指定对应操作
在这里花的时间就长了……妄图通过agg()
对重采样后的不同列分别指定操作。具体来说就是对时间序列的有效数据使用sum()
,对传感器id列使用first()
函数、mean()
函数……(试过了resample所有可用的操作),甚至尝试了使用匿名函数lambda
自定义,都in vain了。真的狠狠吐槽一下为什么只能使用数学函数 > <,代码如下:
data = data.resample('5min').agg({
'POSID': mean,
'ts1': sum, # 再补充一下,这里不能用[]传递同样操作的三个列
'ts2': sum,
'ts3': sum,
})
补充一下resample
后可以使用的函数,官方文档中全部列出。都是一些mathematic methods: ‘first’、‘last’、‘median’、‘max’、‘min’、‘ohlc’,也可以用numpy里面的对应方法。
3. 将传感器id列分出来作为一个DataFrame重采样
不要笑……此时已经丧心病狂了,结果当然作为一个整体出什么错,分开之后还是出什么错。还是献上我的代码人头吧:
decid = data.iloc[:, :1].resample('5min').first()
data = data.iloc[:, 1:].resample('5min').sum(numeric_only=True)
一句话送给自己:人菜还瘾大。