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


Posted in Python onJuly 22, 2019

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

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

data     time
0    6522.50 1.530668e+09
1    6522.66 1.530668e+09
2    6523.79 1.530668e+09
3    6523.79 1.530668e+09
4    6524.82 1.530668e+09
5    6524.35 1.530668e+09
6    6523.66 1.530668e+09
7    6522.64 1.530668e+09
8    6523.25 1.530668e+09
9    6523.88 1.530668e+09
10   6525.30 1.530668e+09
11   6525.70 1.530668e+09
...     ...      ...
407443 6310.69 1.531302e+09
407444 6310.55 1.531302e+09
407445 6310.42 1.531302e+09
407446 6310.40 1.531302e+09
407447 6314.03 1.531302e+09
407448 6314.04 1.531302e+09
407449 6312.84 1.531302e+09
407450 6312.57 1.531302e+09
407451 6312.56 1.531302e+09
407452 6314.04 1.531302e+09
407453 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 data
0   25511135  33
1   25511136  18
2   25511137  25
3   25511138  42
4   25511139  36
5   25511140   7
6   25511141  61
7   25511142  45
8   25511143  46
9   25511144  19
10   25511145  21
...     ...  ...
10387 25521697   3
10388 25521698   9
10389 25521699  16
10390 25521700  13
10391 25521701   4
10392 25521702  34
10393 25521703  124
10394 25521704  302
10395 25521705  86
10396 25521706  52
 
[10397 rows x 2 columns]

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

0    1    2    3   ...  1143 1144 1145 1146
0   6522.50 6522.66 6523.79 6523.79 ...  NaN  NaN  NaN  NaN
1   6523.95 6524.90 6525.00 6524.35 ...  NaN  NaN  NaN  NaN
2   6520.87 6520.00 6520.45 6520.46 ...  NaN  NaN  NaN  NaN
3   6516.34 6516.26 6516.21 6516.21 ...  NaN  NaN  NaN  NaN
4   6513.28 6514.00 6514.00 6514.00 ...  NaN  NaN  NaN  NaN
5   6511.98 6511.98 6511.99 6513.00 ...  NaN  NaN  NaN  NaN
6   6511.00 6511.00 6511.00 6511.00 ...  NaN  NaN  NaN  NaN
7   6511.70 6511.78 6511.99 6511.99 ...  NaN  NaN  NaN  NaN
8   6509.51 6510.00 6510.80 6510.80 ...  NaN  NaN  NaN  NaN
9   6511.36 6510.00 6510.00 6510.00 ...  NaN  NaN  NaN  NaN
10   6507.00 6507.00 6507.00 6507.00 ...  NaN  NaN  NaN  NaN
...    ...   ...   ...   ... ...  ...  ...  ...  ...
10386 6333.77 6331.31 6331.30 6333.19 ...  NaN  NaN  NaN  NaN
10387 6331.68 6331.30 6331.68   NaN ...  NaN  NaN  NaN  NaN
10388 6331.30 6331.30 6331.00 6331.00 ...  NaN  NaN  NaN  NaN
10389 6330.93 6330.92 6330.92 6330.93 ...  NaN  NaN  NaN  NaN
10390 6330.83 6330.83 6330.90 6330.80 ...  NaN  NaN  NaN  NaN
10391 6327.57 6326.00 6326.00 6325.74 ...  NaN  NaN  NaN  NaN
10392 6327.57 6329.70 6328.85 6328.85 ...  NaN  NaN  NaN  NaN
10393 6323.54 6323.15 6323.15 6322.77 ...  NaN  NaN  NaN  NaN
10394 6311.00 6310.83 6310.83 6310.50 ...  NaN  NaN  NaN  NaN
10395 6311.45 6311.32 6310.01 6310.01 ...  NaN  NaN  NaN  NaN
10396 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   1148
0   6522.50 6522.66 6523.79  ...   6522.14 6522.14 25511135
1   6523.95 6524.90 6525.00  ...   6520.00 6520.00 25511136
2   6520.87 6520.00 6520.45  ...   6517.00 6517.00 25511137
3   6516.34 6516.26 6516.21  ...   6514.00 6514.00 25511138
4   6513.28 6514.00 6514.00  ...   6511.97 6511.97 25511139
5   6511.98 6511.98 6511.99  ...   6511.00 6511.00 25511140
6   6511.00 6511.00 6511.00  ...   6510.90 6510.90 25511141
7   6511.70 6511.78 6511.99  ...   6512.09 6512.09 25511142
8   6509.51 6510.00 6510.80  ...   6512.09 6512.09 25511143
9   6511.36 6510.00 6510.00  ...   6507.04 6507.04 25511144
10   6507.00 6507.00 6507.00  ...   6508.57 6508.57 25511145
11   6507.16 6507.74 6507.74  ...   6506.35 6506.35 25511146
...    ...   ...   ...  ...     ...   ...    ...
10388 6331.30 6331.30 6331.00  ...   6331.00 6331.00 25521698
10389 6330.93 6330.92 6330.92  ...   6330.99 6330.99 25521699
10390 6330.83 6330.83 6330.90  ...   6327.58 6327.58 25521700
10391 6327.57 6326.00 6326.00  ...   6325.74 6325.74 25521701
10392 6327.57 6329.70 6328.85  ...   6325.00 6325.00 25521702
10393 6323.54 6323.15 6323.15  ...   6311.00 6311.00 25521703
10394 6311.00 6310.83 6310.83  ...   6315.00 6315.00 25521704
10395 6311.45 6311.32 6310.01  ...   6310.00 6310.00 25521705
10396 6310.46 6310.46 6310.56  ...   6314.04 6314.04 25521706
 
[10397 rows x 1148 columns]

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

Python 相关文章推荐
Python类属性与实例属性用法分析
May 09 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
python实现多进程代码示例
Oct 31 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
python实践项目之监控当前联网状态详情
May 23 Python
python使用Geany编辑器配置方法
Feb 21 Python
keras多显卡训练方式
Jun 10 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
python实现扫雷游戏的示例
Oct 20 Python
python+logging+yaml实现日志分割
Jul 22 #Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 #Python
python Gunicorn服务器使用方法详解
Jul 22 #Python
python实现按行分割文件
Jul 22 #Python
python UDP(udp)协议发送和接收的实例
Jul 22 #Python
linux环境下Django的安装配置详解
Jul 22 #Python
python判断一个对象是否可迭代的例子
Jul 22 #Python
You might like
德生1994机评
2021/03/02 无线电
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
js数组去重的hash方法
2016/12/22 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
python实现超简单端口转发的方法
2015/03/13 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python字符串string的内置方法实例详解
2018/05/14 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
python实现IOU计算案例
2020/04/12 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
优秀员工自荐书
2013/12/19 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS