利用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
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,pandas)