首先说一下需求,我需要将数据以分钟为单位进行分组,然后每一分钟内的数据作为一行输出,因为不同时间的数据量不一样,所以所有数据按照最长的那组数据为准,不足的数据以各自的最后一个数据进行补足。
之后要介绍一下我的数据源,之前没用的数据列已经去除,我只留下要用到的数据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 <div style="color:transparent">本文来源gaodai^.ma#com搞#代!码网</div>25521701 4 10392 25521702 34 10393 25521703 124 10394 25521704 302 10395 25521705 86 10396 25521706 52 [10397 rows x 2 columns]