#python#DataFrame 時間序列資料處理常用操作
有X個機組以15分鐘為步長的長系列(年月日時分)出力的資料,想處理成每個機組的,以“年月日”為索引值,每行顯示1天96個點出力的形式。
先利用df.head()把dataframe按96切割成Y份,然後將Y份的第x列(x號機組的出力)提取出來,放到list裡,再利用concat將list合併為新的dataframe,將該dataframe的列名更改為長系列(年月日),再轉置,就可以得到想要的格式。
1. 已知某元素索引位置,選取該元素
dataframe 如下,記為df
輸入 df.loc['索引名稱‘’,‘列名稱’] 即可,例如
若沒有index或列名稱,則使用df.iloc[]在對應位置輸入索引位置即可。
2. 刪除多行/多列
使用的前提是,dataframe的index和columns用的是數字,利用了drop()和range()函式。
DataFrame.
drop
(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
axis = 0,表示刪除行; axis = 1 表示刪除列。
想刪除多行/列,用range即可,比如要刪除前3行,drop(range(0,3),axis = 0(預設為零,可不寫))即可。
用dataframe.drop()可以刪除,預設inplace = false, 即預設只是刪除檢視,如果要真的刪除數,輸入inplace=True.
【注意】inplace=True 刪除後index也變了。
這個是cookbook對drop的解釋:
3. 多個dataframe中選取列,合併為1個新的dataframe
用到了
1)刪除dataframe索引,重新賦予從0開始的索引;
df.reset_index(drop=True,inplace = True), drop = True表示會刪除原來的舊索引,否則預設會在原dataframe新增一列;
pd.concat(listhere,axis=1,join_axes = [listhere[0].index]), listhere指要被合併的dataframe們,axis = 1表示按列合併,
join_axes 設定了合併的起始點,所以要注意保證每個dataframe的索引值一致,否則會按設定的join_axes合併,其他dataframe如果沒有這個索引值,就會賦值NAN。
3)更改dataframe列的名稱,利用df.columns = list 。
4. 控制輸出為年-月-日的格式
5. 資料缺漏的插補
資料格式是以一分鐘為步長的長系列負荷,從資料庫讀入excel後存在缺漏情況,即並不是每一天的資料都有1440個點。需要把資料處理成15分鐘間隔,即1天有96個點。
Step1. 在excel中,新建一張sheet,第一列索引用excel自動填充,處理成目標範圍以1分鐘為步長的時間序列,作為index。然後使用vlookup在原始資料中比對index,這樣缺漏行會自動返回#NAN值。【由於本身計算精度問題,可能出現兩張表上同一個日期轉為數值後存在百億分之一的誤差,可先採用rounddown()處理一下,取小數點後8位數字就可以了】
這一步也可以利用dataframe的merge來操作,沒研究暫且不寫。
Step2. 利用pandas.interpolate(inplace=True)進行線性插補缺漏值。
6. Dataframe 行選擇和列選擇
在不知道列名的情況下,用索引位置選擇列,用df[[列索引]];
df.iloc[行索引],選取第X行,也可以用df.iloc[0:2]選取第0、1行,df[0:2]也是選取第0、1行。