利用Pandas和Numpy按时间戳将数据以Groupby方式分组
作者:白首太玄经丶 发布时间:2022-01-04 01:47:44
首先说一下需求,我需要将数据以分钟为单位进行分组,然后每一分钟内的数据作为一行输出,因为不同时间的数据量不一样,所以所有数据按照最长的那组数据为准,不足的数据以各自的最后一个数据进行补足。
之后要介绍一下我的数据源,之前没用的数据列已经去除,我只留下要用到的数据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]
来源:https://blog.csdn.net/kengmila9393/article/details/81068217
猜你喜欢
- 第一种: <script language="javascript" type="text/javasc
- 本文实例讲述了python通过加号运算符操作列表的方法。分享给大家供大家参考。具体如下:li = ['a', 'b&
- SQL Server 2005相对于SQL Server 2000做了很大的改进,许些新特性是非常实用的。本文中将通过几个具体示例进行详细的
- 前言在Windows上编写python程序时,有时候需要对输出的文字颜色进行设置,特别是日志显示,不同级别的日志设置不同的颜色进行展示可以直
- asp编程中我们经常要处理字符串,比如一个新闻列表,在我们编写asp程序的时候就要考虑到新闻标题的长度不确定性,因为有的文章标题可能很长,可
- PyQt5不规则窗口实现动画效果实例import sysfrom PyQt5.QtCore import *from PyQt5.QtGui
- Python生成指定数量的优惠码打开Python开发工具IDLE,新建‘codeGen.py'文件,并保存导入需要的包,这里需要ra
- 引言解释器环境:python3.5.1我们都知道python网络编程的两大必学模块socket和socketserver,其中的socket
- 最近项目需要抓包功能,并且抓包后要对数据包进行存库并分析。抓包想使用tcpdump来完成,但是tcpdump抓包之后只能保存为文件,我需要将
- 一,PHP脚本与动态页面。 PHP脚本是一种服务器端脚本程序,可通过嵌入等方 法与HTML文件混合,也可以类,函数封
- Form介绍在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多
- 复制代码 代码如下: public partial class CMS_DBDataContext { partial void OnCre
- 本文实例讲述了php中fgetcsv()函数用法。分享给大家供大家参考。具体方法如下:fgetcsv是一个简单的生成excel文档的函数,从
- 之前使用smarty的时候,通常是在php程序端读取数据(一般从数据库),然后assign给模板的变量,才可以在前端使用这个变量。这样不是不
- 传参时传递可变对象,实际上传的是指向内存地址的指针/引用这个标题是我的结论,也是我在做项目过程查到的。学过C的都知道,函数传参可以传值,也可
- while语句打印1-20的整数,并且每行打印五个数,为了实现每行5个数,我们使用一个if判断语句来实现,判断当打印出5个数之后,自动换行打
- 字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(
- 请问鼠标移过去就出现二级菜单代码怎么写啊 <head><style type="tex
- PHP 备份 mysql 数据库的源代码,在完善的 PHP+Mysql 项目中,在后台都会有备份 Mysql 数据库的功能,有了这个功能,对
- Python编程中经常遇到一些莫名其妙的错误, 其实这不是语言本身的问题, 而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Pyth