侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

利用Pandas和Numpy按时间戳将数据以Groupby方式分组

Python  /  管理员 发布于 5年前   324

首先说一下需求,我需要将数据以分钟为单位进行分组,然后每一分钟内的数据作为一行输出,因为不同时间的数据量不一样,所以所有数据按照最长的那组数据为准,不足的数据以各自的最后一个数据进行补足。

之后要介绍一下我的数据源,之前没用的数据列已经去除,我只留下要用到的数据data列和时间戳time列,时间戳是以秒计的,可以看到一共是407454行。

     data     time0    6522.50 1.530668e+091    6522.66 1.530668e+092    6523.79 1.530668e+093    6523.79 1.530668e+094    6524.82 1.530668e+095    6524.35 1.530668e+096    6523.66 1.530668e+097    6522.64 1.530668e+098    6523.25 1.530668e+099    6523.88 1.530668e+0910   6525.30 1.530668e+0911   6525.70 1.530668e+09...     ...      ...407443 6310.69 1.531302e+09407444 6310.55 1.531302e+09407445 6310.42 1.531302e+09407446 6310.40 1.531302e+09407447 6314.03 1.531302e+09407448 6314.04 1.531302e+09407449 6312.84 1.531302e+09407450 6312.57 1.531302e+09407451 6312.56 1.531302e+09407452 6314.04 1.531302e+09407453 6314.04 1.531302e+09 [407454 rows x 2 columns]

开始进行数据处理,定义一个函数,输入为一个DataFrame和时间列的命名。

def getdata_time(dataframe,name): dataframe[name] = dataframe[name]/60  #将时间转换为分钟 dataframe[name] = dataframe[name].astype('int64')  datalen = dataframe.groupby(name).count().max()   #获取数据最大长度  timeframe = dataframe.groupby(name).count().reset_index()#为了获取时间将分组后时间转换为DataFrame timeseries = timeframe['time']      array = []   #建立一个空数组以便存值 for time, group in dataframe.groupby(name):   tmparray = numpy.array(group['data']) #将series转换为数组并添加到总数组中 array.append(tmparray)  notimedata = pandas.DataFrame(array) notimedata = notimedata.fillna(method='ffill',axis = 1,limit=datalen[0]) #将缺失值补全 notimedata[datalen[0]+1] = timeseries  #把时间添加到最后一列  return notimedata

下面将逐行进行分析,首先要以每分钟为依据进行分组,那么将秒计的时间戳除以60变为分钟,转换为int型是为了观察方便(更改类型是否会导致数据精度缺失影响结果并不清楚,如果有了解的人看到欢迎指出,谢谢)。

datalen是我们要用到的每分钟中最大的数据长度,用来作为标齐依据。DataFrame.groupby.count()是分别显示每组数据的个数,并不是显示有多少个分组,如果想要获取分组后每一组的index就需要用到下一行的reset_index方法,之所以不直接用reset_index而是在count()方法后调用是因为groupby分组后的结果不是一个DataFrame,而经过count()(不仅仅是count,对分组数据操作的方法都可以,只要得出的结果是与每一组的index一一对应即可)操作后就可以得到一个以index为一列,另一列是count结果的DataFrame。以下为直接进行reset_index操作的报错:

AttributeError: Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method

以下为经过count操作后的reset_index方法显示结果,可以看到一共分为了10397组:

      time data0   25511135  331   25511136  182   25511137  253   25511138  424   25511139  365   25511140   76   25511141  617   25511142  458   25511143  469   25511144  1910   25511145  21...     ...  ...10387 25521697   310388 25521698   910389 25521699  1610390 25521700  1310391 25521701   410392 25521702  3410393 25521703  12410394 25521704  30210395 25521705  8610396 25521706  52 [10397 rows x 2 columns]

提取的timeseries将在最后数据整合时使用。现在开始将每组数据提取,首先建立一个空的数组用来存放,然后利用for循环获取每一组的信息,time即为分组的index,group即为每一分组的内容,将数据从group['data']中取出并添加到之前建立的空数组里,循环操作过后转换为DataFrame,当然这个DataFrame中包含了大量缺失值,因为它的列数是以最长的数据为准。如下:

     0    1    2    3   ...  1143 1144 1145 11460   6522.50 6522.66 6523.79 6523.79 ...  NaN  NaN  NaN  NaN1   6523.95 6524.90 6525.00 6524.35 ...  NaN  NaN  NaN  NaN2   6520.87 6520.00 6520.45 6520.46 ...  NaN  NaN  NaN  NaN3   6516.34 6516.26 6516.21 6516.21 ...  NaN  NaN  NaN  NaN4   6513.28 6514.00 6514.00 6514.00 ...  NaN  NaN  NaN  NaN5   6511.98 6511.98 6511.99 6513.00 ...  NaN  NaN  NaN  NaN6   6511.00 6511.00 6511.00 6511.00 ...  NaN  NaN  NaN  NaN7   6511.70 6511.78 6511.99 6511.99 ...  NaN  NaN  NaN  NaN8   6509.51 6510.00 6510.80 6510.80 ...  NaN  NaN  NaN  NaN9   6511.36 6510.00 6510.00 6510.00 ...  NaN  NaN  NaN  NaN10   6507.00 6507.00 6507.00 6507.00 ...  NaN  NaN  NaN  NaN...    ...   ...   ...   ... ...  ...  ...  ...  ...10386 6333.77 6331.31 6331.30 6333.19 ...  NaN  NaN  NaN  NaN10387 6331.68 6331.30 6331.68   NaN ...  NaN  NaN  NaN  NaN10388 6331.30 6331.30 6331.00 6331.00 ...  NaN  NaN  NaN  NaN10389 6330.93 6330.92 6330.92 6330.93 ...  NaN  NaN  NaN  NaN10390 6330.83 6330.83 6330.90 6330.80 ...  NaN  NaN  NaN  NaN10391 6327.57 6326.00 6326.00 6325.74 ...  NaN  NaN  NaN  NaN10392 6327.57 6329.70 6328.85 6328.85 ...  NaN  NaN  NaN  NaN10393 6323.54 6323.15 6323.15 6322.77 ...  NaN  NaN  NaN  NaN10394 6311.00 6310.83 6310.83 6310.50 ...  NaN  NaN  NaN  NaN10395 6311.45 6311.32 6310.01 6310.01 ...  NaN  NaN  NaN  NaN10396 6310.46 6310.46 6310.56 6311.61 ...  NaN  NaN  NaN  NaN [10397 rows x 1147 columns]

可以看到行数是分组个数,一共1147列也是最多的那组数据长度。

之后我们通过调用fillna方法将缺失值进行填充,method='ffill'是指以缺失值前一个数据为依据,axis = 1是以行为单位,limit是指最大填充长度。最终,把我们之前取得的timeseries添加到最后一列,就得到了需求的最终结果。

     0    1    2    ...    1145   1146   11480   6522.50 6522.66 6523.79  ...   6522.14 6522.14 255111351   6523.95 6524.90 6525.00  ...   6520.00 6520.00 255111362   6520.87 6520.00 6520.45  ...   6517.00 6517.00 255111373   6516.34 6516.26 6516.21  ...   6514.00 6514.00 255111384   6513.28 6514.00 6514.00  ...   6511.97 6511.97 255111395   6511.98 6511.98 6511.99  ...   6511.00 6511.00 255111406   6511.00 6511.00 6511.00  ...   6510.90 6510.90 255111417   6511.70 6511.78 6511.99  ...   6512.09 6512.09 255111428   6509.51 6510.00 6510.80  ...   6512.09 6512.09 255111439   6511.36 6510.00 6510.00  ...   6507.04 6507.04 2551114410   6507.00 6507.00 6507.00  ...   6508.57 6508.57 2551114511   6507.16 6507.74 6507.74  ...   6506.35 6506.35 25511146...    ...   ...   ...  ...     ...   ...    ...10388 6331.30 6331.30 6331.00  ...   6331.00 6331.00 2552169810389 6330.93 6330.92 6330.92  ...   6330.99 6330.99 2552169910390 6330.83 6330.83 6330.90  ...   6327.58 6327.58 2552170010391 6327.57 6326.00 6326.00  ...   6325.74 6325.74 2552170110392 6327.57 6329.70 6328.85  ...   6325.00 6325.00 2552170210393 6323.54 6323.15 6323.15  ...   6311.00 6311.00 2552170310394 6311.00 6310.83 6310.83  ...   6315.00 6315.00 2552170410395 6311.45 6311.32 6310.01  ...   6310.00 6310.00 2552170510396 6310.46 6310.46 6310.56  ...   6314.04 6314.04 25521706 [10397 rows x 1148 columns]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Pycharm 文件更改目录后,执行路径未更新的解决方法
    下一条:
    pandas DataFrame 警告(SettingWithCopyWarning)的解决
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客