csv模塊包含在python標准庫中,可用於分析CSV文件中的數據行,讓我們能夠快速提取感興趣的值。首先繪制一個簡單的折線圖:
1 #!usr/bin/env python 2 #*-*Coding=UTF-8 *-* 3 import csv #導入csv模塊 4 from matplotlib import pyplot as plt 5 6 filename = 'sitka_weather_07-2014.csv' #要處理的文件名,2014年7月的數值 7 8 with open(filename) as file_object: #打開文件filename並且將結果文件對象存儲在file_object中 9 reader = csv.reader(file_object) #調用csv.reader()將文件對象file_object作為實參傳遞給閱讀器reader 10 header_row = next(reader) #調用一次next,得到文件的第一行 11 row_2 = next(reader) #再調用一次next,就會得到文件第二行的內容 12 #print(header_row,row_2) 13 14 #文件頭的格式並非總是一致,空格和單位可能總是出現在奇怪的地方。這在原始數據文件中很常見,但不會帶來任何問題 15 #為讓文件頭更容易理解,將列表中的每個頭文件及其位置打印出來 16 for index, column_header in enumerate(header_row): #調用enumerate()來獲取每個元素的索引及其值。 17 print(index, column_header) #打印索引,還有對應的值 18 19 #提取並讀取數據 20 highs = [] #創建空列表來存儲最高氣溫 21 for row in reader: #在文件對象中循環讀取每一行 22 print(row,"\n") #打印文件對象中的所有行 23 print(type(row[1])) #查看第一行第一列數據類型 24 #highs.append(row[1]) #把每一行索引為1的值(字符串)附加到列表,也就是文件中我們所需的最高氣溫 25 high = int(row[1]) #將每一行的索引值為1的類型為字符串的值轉化成整型以便繪制圖形 26 highs.append(high) #將轉化成整型的數值依次附加到列表末尾 27 28 print(highs) #打印是不是符合預期 29 30 #繪制最高氣溫圖表 31 fig = plt.figure(dpi=128,figsize=(16,9)) #定義圖表輸出樣式 32 plt.plot(highs,c='red') #繪制最高氣溫並且把顏色設置成紅色 33 34 plt.title("Daily High Temperatures of Sitka in July 2014",fontsize=14) #圖形標題 35 plt.xlabel(" ",fontsize=10) #圖形x軸標簽 36 plt.ylabel("Temperatures (F) ",fontsize=10) #圖形y軸標簽 37 plt.tick_params(axis='both',which='major',labelsize=5) #刻度參數 38 39 plt.show() #顯示圖形
沒有出錯的話,效果圖應該如下。應該注意的一點是,代碼中,如果沒把從每一行索引值為1的字符串轉化成整型數據類型,matplotlib也能畫圖,但是繪制出來的圖形不是預期的。
---------------------------------------------------------------------------------我是分割線---------------------------------------------------------------------------------
上面的圖形只繪制了一個簡單的表示最高氣溫的折線圖,下面來添加時間還有最低氣溫還有涵蓋更長時間(sitka_weather_2014.csv,即一整年的數值)以便比較:
1 #!usr/bin/env python 2 # *-* Coding=utf-8 *-* 3 4 import csv #導入csv模塊 5 from matplotlib import pyplot as plt #導入模塊以便繪圖 6 from datetime import datetime #導入模塊處理日期格式 7 8 filename = 'sitka_weather_2014.csv' #要處理的文件名 9 with open(filename) as file_object: #打開文件並將結果文件對象存儲在file_object中 10 reader = csv.reader(file_object) #調用csv.reader()將文件對象file_object作為實參傳遞給閱讀器reader 11 header_row = next(reader) #調用一次next,得到文件的第一行 12 row_2 = next(reader) #再調用一次next,得到文件第二行 13 print(header_row,row_2) #打印一下是不是符合預期 14 15 #文件頭的格式並非總是一致,空格和單位可能總是出現在奇怪的地方。這在原始數據文件中很常見,但不會帶來任何問題 16 for index, column_header in enumerate(header_row): #調用enumerate來獲取每個元素的索引及其值 17 print(index, column_header) #打印索引還有對應的值 18 19 highs = [] #創建空列表以存儲最高氣溫 20 dates =[] #創建空列表以存儲日期 21 lows = [] #創建空列表以存儲最低氣溫 22 for row in reader: #循環讀取文件對象的每一行 23 high = int(row[1]) #把每一行索引為1的值即最高氣溫(字符串)轉換成整型 24 date = datetime.strptime(row[0],"%Y-%m-%d") #利用datetime模塊處理日期格式 25 low = int(row[3]) #把每一行索引為3的值即最低氣溫(字符串)轉換成整型 26 27 highs.append(high) #將轉換好的整型數值通過循環依次附加到列表末尾形成最高氣溫列表highs 28 dates.append(date) #將做好格式的日期通過循環依次福建到列表末尾以形成日期列表dates 29 lows.append(low) #將轉換好的整型數值通過循環依次福建到列表末尾形成最低氣溫列表lows 30 31 print(highs,dates,lows) #打印一下是不是符合預期 32 #開始繪制圖表 33 fig = plt.figure(dpi=128,figsize=(16,9)) #定義圖表輸出的dpi數值和輸出格式 34 plt.plot(dates,highs,c='red',alpha=0.5) #繪制最高氣溫數據系列,並把線條設置為紅色,不透明度設置為0.5 35 plt.plot(dates,lows,c='blue',alpha=0.5) #繪制最低氣溫數據系列,並把線條設置為藍色,不透明度設置為0.5 36 plt.title("High and Low temperature of Sitka in 2014",fontsize=10) #圖形標題 37 plt.xlabel(' ',fontsize=8) #x軸標簽,繪制空標簽,因為日期會出現在x軸標簽位置 38 plt.ylabel("Temperatures (F) ",fontsize=8) #y軸標簽 39 plt.tick_params(axis='both',labelsize=8) #刻度參數 40 fig.autofmt_xdate() #繪制斜體日期標簽,以免日期標簽太長而彼此重疊 41 #方法fill_between()接收一個x值系列和兩個y值系列,並填充兩個y值系列的空間 42 plt.fill_between(dates,highs,lows,color='green',alpha=0.1) #dates是x值系列,兩個y值系列分別是highs和lows,顏色設置為綠色,不透明度設置為0.1 43 plt.show() #顯示圖形 44
沒有出錯的話,效果圖應該如下。通過着色,讓兩個數據集之間的區域顯而易見。
---------------------------------------------------------------------------------我是分割線---------------------------------------------------------------------------------
最后一個內容是錯誤檢查。上面的代碼,應該能處理來自世界各地任何地方的天氣數據(可能會出現參數要改的情況),假定有的氣象站出現了故障(或者服務器故障,或者工作人員粗心),未能收集部分或者全部應該收集的數據。缺失數據缺失可能會引發程序異常。下面把文件改成另一個文件,有數據缺失的情況。運行出現如下錯誤:
Traceback (most recent call last):
File "practice.py", line 23, in <module>
high = int(row[1]) #把每一行索引為1的值即最高氣溫(字符串)轉換成整型
ValueError: invalid literal for int() with base 10: ''
這個錯誤表明,python無法將空字符串' '轉換成整型。通過打印print(row),發現:
['2014-2-16', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '0.00', '', '', '-1']
2014年2月16日的一整行數據大部分都是空的,特別是需要的最高氣溫和最低氣溫。現在來改下代碼以適應這種情況:
1 #!usr/bin/env python 2 # *-* Coding=utf-8 *-* 3 4 import csv #導入csv以處理csv文件 5 from matplotlib import pyplot as plt #從matplotlib導入pyplot以處理圖形 6 from datetime import datetime #導入datetime以處理日期 7 8 filename = 'death_valley_2014.csv' #要處理的文件 9 with open(filename) as file_object: #打開文件並將結果文件對象存儲在file_object中 10 reader = csv.reader(file_object) #調用csv.reader()將文件對象file_object作為實參傳遞給reader 11 header_row = next(reader) #調用next,讀取文件的第一行 12 print(header_row) #打印是否符合預期 13 14 for index, column_header in enumerate(header_row): #調用enumerate()獲取每個元素的索引和值 15 print(index,column_header) #打印索引還有對應的值 16 #文件頭的格式並非總是一致,空格和單位可能總是出現在奇怪的地方。這在原始數據中非常常見,但不會帶來任何問題。 17 #為讓文件頭更容易理解,將列表中的每個頭文件及其位置打印出來 18 highs = [] #創建空列表以存儲最高氣溫 19 dates = [] #創建空列表以存儲日期 20 lows = [] #創建空列表以存儲最低氣溫 21 22 for row in reader: #循環讀取文件對象的每一行 23 #開始錯誤檢查和處理,對於文件對象的每一行,都嘗試從中提取日期,最高氣溫和最低氣溫,嘗試失敗就會引發ValueError異常 24 try: 25 high = int(row[1]) 26 date = datetime.strptime(row[0],"%Y-%m-%d") 27 low = int(row[3]) 28 except ValueError: #處理ValueError異常 29 #pass #直接pass,忽略 30 print(date,"data missing") #打印出缺失的數據日期和提示語 31 else: 32 highs.append(high) #將沒有引發ValueError異常並且提取到的數值附加到列表highs末尾形成列表highs 33 dates.append(date) #將沒有引發ValueError異常並且提取到的數值附加到列表dates末尾形成列表dates 34 lows.append(low) #將沒有引發ValueError異常並且提取到的數值附加到列表lows末尾形成列表lows 35 36 fig = plt.figure(dpi=128,figsize=(16,9)) #定義圖表輸出的dpi數值和輸出格式 37 plt.plot(dates,highs,c='red',alpha=0.5) #繪制最高氣溫數據系列,並把線條設置為紅色,不透明度設置為0.5 38 plt.plot(dates,lows,c='blue',alpha=0.5) #繪制最低氣溫數據系列,並把線條設置為藍色,不透明度設置為0.5 39 plt.title("High and Low Temperature (F) of Death Valley in 2014",fontsize=10) #圖形標題 40 plt.xlabel(' ',fontsize=8) #x軸標簽,繪制空標簽,因為日期會出現在x軸標簽位置 41 plt.ylabel('Temperature (F)',fontsize=8) #y軸標簽 42 plt.tick_params(axis='both',which='major',labelsize=5) #刻度參數 43 fig.autofmt_xdate() #繪制斜體日期標簽,以免日期標簽太長而彼此重疊 44 #方法fill_between()接收一個x值系列和兩個y值系列,並填充兩個y值系列的空間 45 plt.fill_between(dates,highs,lows,color='green',alpha=0.1) #dates是x值系列,兩個y值系列分別是highs和lows,顏色設置為綠色,不透明度設置為0.1 46 plt.show() #顯示圖形
沒有出錯的話,效果圖應該如下。
打完收工,數據參考:<python編程,從入門班到實踐>。