利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
首先說一下需求,我需要將數(shù)據(jù)以分鐘為單位進(jìn)行分組,然后每一分鐘內(nèi)的數(shù)據(jù)作為一行輸出,因?yàn)椴煌瑫r(shí)間的數(shù)據(jù)量不一樣,所以所有數(shù)據(jù)按照最長的那組數(shù)據(jù)為準(zhǔn),不足的數(shù)據(jù)以各自的最后一個(gè)數(shù)據(jù)進(jìn)行補(bǔ)足。
之后要介紹一下我的數(shù)據(jù)源,之前沒用的數(shù)據(jù)列已經(jīng)去除,我只留下要用到的數(shù)據(jù)data列和時(shí)間戳time列,時(shí)間戳是以秒計(jì)的,可以看到一共是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]
開始進(jìn)行數(shù)據(jù)處理,定義一個(gè)函數(shù),輸入為一個(gè)DataFrame和時(shí)間列的命名。
def getdata_time(dataframe,name): dataframe[name] = dataframe[name]/60 #將時(shí)間轉(zhuǎn)換為分鐘 dataframe[name] = dataframe[name].astype('int64') datalen = dataframe.groupby(name).count().max() #獲取數(shù)據(jù)最大長度 timeframe = dataframe.groupby(name).count().reset_index()#為了獲取時(shí)間將分組后時(shí)間轉(zhuǎn)換為DataFrame timeseries = timeframe['time'] array = [] #建立一個(gè)空數(shù)組以便存值 for time, group in dataframe.groupby(name): tmparray = numpy.array(group['data']) #將series轉(zhuǎn)換為數(shù)組并添加到總數(shù)組中 array.append(tmparray) notimedata = pandas.DataFrame(array) notimedata = notimedata.fillna(method='ffill',axis = 1,limit=datalen[0]) #將缺失值補(bǔ)全 notimedata[datalen[0]+1] = timeseries #把時(shí)間添加到最后一列 return notimedata
下面將逐行進(jìn)行分析,首先要以每分鐘為依據(jù)進(jìn)行分組,那么將秒計(jì)的時(shí)間戳除以60變?yōu)榉昼?,轉(zhuǎn)換為int型是為了觀察方便(更改類型是否會(huì)導(dǎo)致數(shù)據(jù)精度缺失影響結(jié)果并不清楚,如果有了解的人看到歡迎指出,謝謝)。
datalen是我們要用到的每分鐘中最大的數(shù)據(jù)長度,用來作為標(biāo)齊依據(jù)。DataFrame.groupby.count()是分別顯示每組數(shù)據(jù)的個(gè)數(shù),并不是顯示有多少個(gè)分組,如果想要獲取分組后每一組的index就需要用到下一行的reset_index方法,之所以不直接用reset_index而是在count()方法后調(diào)用是因?yàn)間roupby分組后的結(jié)果不是一個(gè)DataFrame,而經(jīng)過count()(不僅僅是count,對(duì)分組數(shù)據(jù)操作的方法都可以,只要得出的結(jié)果是與每一組的index一一對(duì)應(yīng)即可)操作后就可以得到一個(gè)以index為一列,另一列是count結(jié)果的DataFrame。以下為直接進(jìn)行reset_index操作的報(bào)錯(cuò):
AttributeError: Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method
以下為經(jīng)過count操作后的reset_index方法顯示結(jié)果,可以看到一共分為了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將在最后數(shù)據(jù)整合時(shí)使用?,F(xiàn)在開始將每組數(shù)據(jù)提取,首先建立一個(gè)空的數(shù)組用來存放,然后利用for循環(huán)獲取每一組的信息,time即為分組的index,group即為每一分組的內(nèi)容,將數(shù)據(jù)從group['data']中取出并添加到之前建立的空數(shù)組里,循環(huán)操作過后轉(zhuǎn)換為DataFrame,當(dāng)然這個(gè)DataFrame中包含了大量缺失值,因?yàn)樗牧袛?shù)是以最長的數(shù)據(jù)為準(zhǔn)。如下:
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]
可以看到行數(shù)是分組個(gè)數(shù),一共1147列也是最多的那組數(shù)據(jù)長度。
之后我們通過調(diào)用fillna方法將缺失值進(jìn)行填充,method='ffill'是指以缺失值前一個(gè)數(shù)據(jù)為依據(jù),axis = 1是以行為單位,limit是指最大填充長度。最終,把我們之前取得的timeseries添加到最后一列,就得到了需求的最終結(jié)果。
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]
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)
- mysql通過group?by分組取最大時(shí)間對(duì)應(yīng)數(shù)據(jù)的兩種有效方法
- python?DataFrame數(shù)據(jù)分組統(tǒng)計(jì)groupby()函數(shù)的使用
- MySQL數(shù)據(jù)庫分組查詢group by語句詳解
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
- 基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù)
- Sql group by 分組取時(shí)間最新的一條數(shù)據(jù)(示例代碼)
相關(guān)文章
一文讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用【建議收藏】
在使用python的時(shí)候,經(jīng)常使用到pip這個(gè)工具,可以很方便的線上安裝依賴庫,當(dāng)然pip還有很多參數(shù)都可以幫我們?nèi)ゲ樵円恍煨畔?這篇文章主要給大家介紹了如何通過一篇文章讓你秒懂精通pip并快速體驗(yàn)深度學(xué)習(xí)應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-08-08Python常用時(shí)間操作總結(jié)【取得當(dāng)前時(shí)間、時(shí)間函數(shù)、應(yīng)用等】
這篇文章主要介紹了Python常用時(shí)間操作,包括取得當(dāng)前時(shí)間、時(shí)間函數(shù)、應(yīng)用等概念與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05詳細(xì)解讀Python的web.py框架下的application.py模塊
這篇文章主要介紹了Python的web.py框架下的application.py模塊,作者深入分析了web.py的源碼,需要的朋友可以參考下2015-05-05利用Python代碼實(shí)現(xiàn)一鍵摳背景功能
這篇文章主要給大家介紹了關(guān)于如何利用Python代碼實(shí)現(xiàn)一鍵摳背景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12詳解Pandas如何高效對(duì)比處理DataFrame的兩列數(shù)據(jù)
我們?cè)谟?pandas?處理數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)遇到用其中一列數(shù)據(jù)替換另一列數(shù)據(jù)的場(chǎng)景。這一類的需求估計(jì)很多人都遇到,當(dāng)然還有其它更復(fù)雜的。解決這類需求的辦法有很多,這里我們來推薦幾個(gè)2022-09-09TensorFlow利用saver保存和提取參數(shù)的實(shí)例
今天小編就為大家分享一篇TensorFlow利用saver保存和提取參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python文件操作及內(nèi)置函數(shù)flush原理解析
這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Docker如何部署Python項(xiàng)目的實(shí)現(xiàn)詳解
這篇文章主要介紹了Docker如何部署Python項(xiàng)目的實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10