【Pandas时间序列处理】Resample踩坑实录

【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)

一句话送给自己:人菜还瘾大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值