1. 程式人生 > >Python時間序列缺失值處理(日期缺失填充)完全教程-附Python完整例程

Python時間序列缺失值處理(日期缺失填充)完全教程-附Python完整例程

前言

因近期進行時間序列分析時遇到了資料預處理中的缺失值處理問題,其中日期缺失和填充在網上沒有找到較好較全資料,耗費了我一晚上工作時間,所以下面我對這次時間序列缺失值處理學習做了以下小結以供之後同行們參考指正。

時間序列缺失值處理

一、程式設計前準備

        收集時間序列資料,相信看這篇部落格的各位已經完成了這步。

        需要安裝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