初償用Python處理時間序列的數據,碰到一些坑。以此文記錄一下,希望后來者可以少走彎路。
背景說明:我是用一個已有的csv數據表作為原材料進行處理的。
目的:實現時間序列的可視化,及周期性的可視化。
1、碰到的第一個坑是,導入到時間數據,默認的是字符串的數據類型。因此,在可視化的時候,會出現沒有按時間先后順序的方式繪圖的狀況。
因此,需要將字符串解析為時間類型的數據類型。
方法1:是在讀取數據的時候,采用parse_dates=True,自動解析其中的時間數據。
方法2:使用dateuyil包中的parser.parse解析時間字符串:
from dateutil.parser import parse v1 = parse('2018-09-02') print("解析后的時間格式為:",v1)
# 這里的v1是一個datetime.datetime對象,如果需要轉str請參照以下
print(v1.strftime('%Y-%m-%d %H:%M:%S'))
方法3:利用pandas的to_datetime處理時間list
import pandas as pd datestrs = ['2018/09/02','2018/09/03','2018/09/04'] print(pd.to_datetime(datestrs))
2、第2個坑是處理數值型數據的時候,在導入pandas下默認是object的數據類型,此時需要強制轉換數據類型,但是我一直沒法轉換。
出現的BUG就是:ValueError: could not convert string to float
后來找了半天才找到原因:是數據中含有空格或者“,”才導致無法將string轉為int。
解決辦法:replace(' ','').replace(',','')即替換掉其中的空格,刪除其中的“,”
3、至於后面的繪圖就很簡單了,唯一值得說一下的是周期性的圖的繪制。
我采用的是按“周”來繪圖的,周期的固定的。實現過程看代碼就好。
4、另外需要提一下,讀取文件的時候需要設置encoding = 'gbk'。默認的是utf-8,但是系統會報錯。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Leslie Dang 4 5 import numpy as np 6 import pandas as pd 7 import matplotlib.pyplot as plt 8 9 # 01從文件導入數據 10 data1 = pd.read_csv('01series.csv',parse_dates=True,index_col=0,encoding = 'gbk') 11 print(data1) 12 # print(type(data1.index)) 13 print(data1.dtypes) 14 15 # 02強制轉換數據類型 16 print('***02強制轉換數據類型***') 17 18 # ValueError: could not convert string to float 19 # 原因:很可能是你的數據中含有\t,或者空格,或者“,” 20 # 解決辦法:replace(' ','').replace(',','') 21 22 for i in range(data1['銷售額'].count()): 23 data1['銷售額'][i] = data1['銷售額'][i].replace(' ','').replace(',','') 24 25 data1['銷售額'] = data1['銷售額'].astype(int) 26 print(data1.dtypes) 27 28 # 03繪圖-線圖 29 print('***03繪圖***') 30 # plt.plot(data1['銷售額'],label = '銷售額') 31 # plt.show() 32 33 # 04繪圖-周期性分析圖 34 print('***04繪圖-周期性分析圖***') 35 36 data1 = data1.set_index('星期') 37 print(data1) 38 39 count = data1['銷售額'].count() 40 circle = count//7 41 print(count,circle) 42 for i in range(circle): 43 plt.plot(data1['銷售額'][7*i:7*i+7]) 44 plt.show() 45 46 # 思考:如何量化周期性?采用什么參數可以表達?周期性的強度如何?
這里補上我采用的數據源:
星期 銷售額 日期 2018-08-01 Wed 4,702,986 2018-08-02 Thu 5,034,151 2018-08-03 Fri 5,636,981 2018-08-04 Sat 6,377,764 2018-08-05 Sun 6,138,548 2018-08-06 Mon 5,335,273 2018-08-07 Tue 5,055,513 2018-08-08 Wed 5,159,413 2018-08-09 Thu 5,393,767 2018-08-10 Fri 5,920,339 2018-08-11 Sat 6,637,867 2018-08-12 Sun 6,292,839 2018-08-13 Mon 5,485,055 2018-08-14 Tue 5,274,536 2018-08-15 Wed 5,171,561 2018-08-16 Thu 5,269,780 2018-08-17 Fri 5,359,121 2018-08-18 Sat 6,353,952 2018-08-19 Sun 6,334,198 2018-08-20 Mon 5,577,552 2018-08-21 Tue 5,276,165 2018-08-22 Wed 5,403,919 2018-08-23 Thu 5,611,874 2018-08-24 Fri 6,073,795 2018-08-25 Sat 6,754,291 2018-08-26 Sun 6,333,426 2018-08-27 Mon 5,570,875 2018-08-28 Tue 5,327,305 2018-08-29 Wed 5,425,794