利⽤Pandas和Numpy按时间戳将数据以Groupby⽅式分
⾸先说⼀下需求,我需要将数据以分钟为单位进⾏分组,然后每⼀分钟内的数据作为⼀⾏输出,因为不同时间的数据量不⼀样,所以所有数据按照最长的那组数据为准,不⾜的数据以各⾃的最后⼀个数据进⾏补⾜。
之后要介绍⼀下我的数据源,之前没⽤的数据列已经去除,我只留下要⽤到的数据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
groupby分组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 = upby(name).count().max()  #获取数据最⼤长度
timeframe = upby(name).count().reset_index()#为了获取时间将分组后时间转换为DataFrame
timeseries = timeframe['time']
array = []  #建⽴⼀个空数组以便存值
for time, group upby(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是我们要⽤到的每分钟中最⼤的数据长度,⽤来作为标齐依据。unt()是分别显⽰每组数据的个数,并不是显⽰有多少个分组,如果想要获取分组后每⼀组的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.3
4 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.3
4 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]
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。