佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 利用pandas按日期做分組運(yùn)算的操作

利用pandas按日期做分組運(yùn)算的操作

熱門標(biāo)簽:語(yǔ)音系統(tǒng) Win7旗艦版 呼叫中心市場(chǎng)需求 企業(yè)做大做強(qiáng) 百度AI接口 硅谷的囚徒呼叫中心 電話運(yùn)營(yíng)中心 客戶服務(wù)

原始數(shù)據(jù)

TS PERIOD REQUEST STEPPED VALUE STATUS SECONDS
20-DEC-16 00:00:00.0 600 1 0  2.018 0 1482163200
20-DEC-16 00:01:00.0 600 1 0  2.019 0 1482163260
20-DEC-16 00:02:00.0 600 1 0  2.019 0 1482163320
20-DEC-16 00:03:00.0 600 1 0  2.019 0 1482163380
20-DEC-16 00:04:00.0 600 1 0  2.019 0 1482163440
20-DEC-16 00:05:00.0 600 1 0  2.020 0 1482163500
20-DEC-16 00:06:00.0 600 1 0  2.020 0 1482163560

我們的目標(biāo)是把TS列從

20-DEC-16 00:00:00.0

轉(zhuǎn)變?yōu)?/p>

20-DEC-16

的格式,然后按天取均值。

導(dǎo)入包

import numpy as np
from pandas import DataFrame, Series
import pandas as pd
from datetime import datetime

讀入文件

df = pd.read_csv('data/test.txt',sep='\t')

這里沒(méi)有解決中文路徑名和絕對(duì)路徑的問(wèn)題.

轉(zhuǎn)化為數(shù)據(jù)框

df = DataFrame(df)

轉(zhuǎn)化為時(shí)間格式

將TS列轉(zhuǎn)化為時(shí)間格式,并保存為新的一列DATE,之后,只留下DATE和VALUE兩列,其他統(tǒng)統(tǒng)不要。

df['DATE'] = pd.to_datetime(df['TS'])
df = df[['DATE','VALUE']]

關(guān)鍵一步

把形如‘2017-9-4 00:00:00'轉(zhuǎn)化為‘2017-9-4 '

df['DATE'] = [datetime.strftime(x,'%Y-%m-%d') for x in df['DATE']]

strftime有若干參數(shù),其中Y表示四位數(shù)的年,m表示兩位數(shù)的月。

旋轉(zhuǎn)數(shù)據(jù)框

df =df.pivot_table(index='DATE',aggfunc='mean')

補(bǔ)充:利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組

首先說(shuō)一下需求,我需要將數(shù)據(jù)以分鐘為單位進(jìn)行分組,然后每一分鐘內(nèi)的數(shù)據(jù)作為一行輸出,因?yàn)椴煌瑫r(shí)間的數(shù)據(jù)量不一樣,所以所有數(shù)據(jù)按照最長(zhǎng)的那組數(shù)據(jù)為準(zhǔn),不足的數(shù)據(jù)以各自的最后一個(gè)數(shù)據(jù)進(jìn)行補(bǔ)足。

之后要介紹一下我的數(shù)據(jù)源,之前沒(méi)用的數(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ù)最大長(zhǎng)度 
 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)榉昼姡D(zhuǎn)換為int型是為了觀察方便(更改類型是否會(huì)導(dǎo)致數(shù)據(jù)精度缺失影響結(jié)果并不清楚,如果有了解的人看到歡迎指出,謝謝)。

datalen是我們要用到的每分鐘中最大的數(shù)據(jù)長(zhǎng)度,用來(lái)作為標(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)過(guò)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)過(guò)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í)使用。

現(xiàn)在開始將每組數(shù)據(jù)提取,首先建立一個(gè)空的數(shù)組用來(lái)存放,然后利用for循環(huán)獲取每一組的信息,time即為分組的index,group即為每一分組的內(nèi)容,將數(shù)據(jù)從group['data']中取出并添加到之前建立的空數(shù)組里,循環(huán)操作過(guò)后轉(zhuǎn)換為DataFrame,當(dāng)然這個(gè)DataFrame中包含了大量缺失值,因?yàn)樗牧袛?shù)是以最長(zhǎng)的數(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ù)長(zhǎng)度。

之后我們通過(guò)調(diào)用fillna方法將缺失值進(jìn)行填充,method='ffill'是指以缺失值前一個(gè)數(shù)據(jù)為依據(jù),axis = 1是以行為單位,limit是指最大填充長(zhǎng)度。最終,把我們之前取得的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]

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • pandas 實(shí)現(xiàn)某一列分組,其他列合并成list
  • pandas 實(shí)現(xiàn)分組后取第N行
  • pandas分組排序 如何獲取第二大的數(shù)據(jù)
  • pandas group分組與agg聚合的實(shí)例
  • pandas groupby分組對(duì)象的組內(nèi)排序解決方案
  • pandas組內(nèi)排序,并在每個(gè)分組內(nèi)按序打上序號(hào)的操作

標(biāo)簽:崇左 海南 喀什 安康 長(zhǎng)沙 山西 山西 濟(jì)南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《利用pandas按日期做分組運(yùn)算的操作》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    杨浦区| 利辛县| 葫芦岛市| 南京市| 衡南县| 贡嘎县| 平山县| 沛县| 平和县| 上蔡县| 石屏县| 泉州市| 思南县| 潮州市| 高安市| 喀喇沁旗| 镇远县| 中江县| 皮山县| 共和县| 潍坊市| 清苑县| 道真| 旌德县| 茂名市| 卢氏县| 崇左市| 台湾省| 灵川县| 元江| 克拉玛依市| 罗源县| 正镶白旗| 正蓝旗| 儋州市| 枞阳县| 沙雅县| 抚顺市| 汤原县| 周宁县| 宁陵县|