前言
因近期進行時間序列分析時遇到了數據預處理中的缺失值處理問題,其中日期缺失和填充在網上沒有找到較好較全資料,耗費了我一晚上工作時間,所以下面我對這次時間序列缺失值處理學習做了以下小結以供之后同行們參考指正。
時間序列缺失值處理
一、編程前準備
收集時間序列數據,相信看這篇博客的各位已經完成了這步。
需要安裝pandas模塊,并利用Python的Lib文件夾自帶的datetime庫(當時我因為在Pycharm環境中沒看到datetime模塊又去安裝了DateTime模塊并看了DateTime英文文檔,發現這個對象的參數并不能滿足時間序列缺失填充的需求,所以又下了datetime2模塊,在import? datetime2時發現Python自帶datetime庫,血虐啊,真是對菜鳥不要太善良)。
二、編程與講解
因為我的數據不是普遍形式的時間序列形式,而下面程序是我按普遍形式時間序列數據改編的,與我數據不適用,所以可能存在問題,但是程序所用步驟和程序原理都是與原程序相同,對于初步接觸的同行具有一定的借鑒和參考意義。
import pandas as pd import datetime def load_Data(): #加載數據 df0 = pd.read_csv("Path/power.csv",index_col='user_id') df0['record_date'] = pd.to_datetime(df0['record_date']) return df0 #把datetime轉成字符串 def datetime_toString(dt): return dt.strftime("%Y-%m-%d") #把字符串轉成datetime def string_toDatetime(string): return datetime.strptime(string, "%Y-%m-%d") #缺失值處理,插值替換 def data_Full(): df1 = load_Data() #加載數據 date_start = df1.iloc[0, 0] #初始時間 df1_date = df1['record_date'].tolist() #數據日期轉為列表 df1_data = df1[ 'value'].tolist() #數據值轉為列表 act = 365 #實際期望日期序列長度 for j in range(0, len(df1_date)): if len(df1_date) < act: date0 = date_start date_s = datetime_toString(date0) #日期轉換為字符串類型,使日期可進行邏輯比較 date_i = df1_date[j] #順序選取數據中日期列表里對應各日期 date_is = datetime_toString(date_i) while date_is != date_s: #如數據中日期列表與期望日期序列不相等,即存在缺失值執行while程序 nada = (df1_data[j] + df1_data[j+1]) / 2 #計算缺失處左右相鄰插值 adda = [date0, nada] date_da = pd.DataFrame(adda).T date_da.columns = df1.columns df1 = pd.concat([df1, date_da]) #將缺失日期加入數據列表中 date0 += datetime.timedelta(days=1) #日期加一 date_s = datetime_toString(date0) #日期字符串轉日期時間類型 date0 += datetime.timedelta(days=1) #日期加一 date_s = datetime_toString(date0) #日期字符串轉日期時間類型 df1 = df1.sort_values(by=['record_date']) return df1
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
