在"使用Python进行数据可视化(三、处理csv文件)"中,我们成功地从csv文件中获取了最高气温的信息,并且绘制了一个直观的折线图。接下来,我们还可以添加一些东西,使其显示更多的信息。
1.显示日期、时间信息
模板 datetime
datetime.datetime
在Python的官方文档中search datetime可以找到关于datetime的使用说明。
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
......
我们要用到的是:
strptime()
classmethod datetime.strptime(date_string, format)¶
Return a datetime corresponding to date_string, parsed according to format. This is equivalent to datetime(*(time.strptime(date_string, format)[0:6])). ValueError is raised if the date_string and format can’t be parsed by time.strptime() or if it returns a value which isn’t a time tuple. For a complete list of formatting directives, see strftime() and strptime() Behavior.
format的参数很多,在官方文档中可以找到。
从文档的介绍中我们可以知道,strptime的功能和用法,我们传入两个参数,第一个为日期的字符串,第二个为格式设置的参数。 而strptime将返回一个相应日期的对象。
举例:
给图加上日期
#导入csv模块 import csv #导入datetime from datetime import datetime # from matplotlib import pyplot as plt #指定文件名,然后使用 with open() as 打开 filename = 'sitka_weather_07-2014.csv' with open(filename) as f: #创建一个阅读器:将f传给csv.reader reader = csv.reader(f) #使用csv的next函数,将reader传给next,将返回文件的下一行 header_row = next(reader) # for index, column_header in enumerate(header_row): #print(index, column_header) #读取最高气温 #创建最高气温的列表 highs =[] dates = [] #遍历reader的余下的所有行(next读取了第一行,reader每次读取后将返回下一行) for row in reader: # current_date = datetime.strptime(row[0],"%Y-%m-%d") dates.append(current_date) #将字符串转换成数字 high = int(row[1]) highs.append(high) #绘制图形 fig = plt.figure(dpi=128, figsize=(10,6)) plt.plot(dates,highs,c='red') #设置图形的格式 plt.title("Daily high temperature, July 2014", fontsize=24) plt.xlabel('',fontsize=16) fig.autofmt_xdate() plt.ylabel("Temperature(F)", fontsize=16) plt.tick_params(axis='both', which="major", labelsize=16) plt.show() #导入datetime from datetime import datetime # from matplotlib import pyplot as plt #指定文件名,然后使用 with open() as 打开 filename = 'sitka_weather_07-2014.csv' with open(filename) as f: #创建一个阅读器:将f传给csv.reader reader = csv.reader(f) #使用csv的next函数,将reader传给next,将返回文件的下一行 header_row = next(reader) # for index, column_header in enumerate(header_row): #print(index, column_header) #读取最高气温 #创建最高气温的列表 highs =[] dates = [] #遍历reader的余下的所有行(next读取了第一行,reader每次读取后将返回下一行) for row in reader: # current_date = datetime.strptime(row[0],"%Y-%m-%d") dates.append(current_date) #将字符串转换成数字 high = int(row[1]) highs.append(high) #绘制图形 fig = plt.figure(dpi=128, figsize=(10,6)) plt.plot(dates,highs,c='red') #设置图形的格式 plt.title("Daily high temperature, July 2014", fontsize=24) plt.xlabel('',fontsize=16) fig.autofmt_xdate() plt.ylabel("Temperature(F)", fontsize=16) plt.tick_params(axis='both', which="major", labelsize=16) plt.show()
2.更多的信息-将数据扩大到2014年
要将分析的范围扩大到2014年我们只需得到2014年的csv文件,然后同样的方法,就可以得到2014年的最高气温折线图。
将 filename 改为'sitka_weather_2014.csv'
同时修改标题
plt.title("Daily high temperature, 2014", fontsize=24)
即可。
3.更多的信息,加上最低气温
和最高气温的方法类似,我们可以读取最低气温,并且把它和最高气温绘制在同一张图上。
lows= []
low = int(row[3])
lows.append(low)
plt.plot(dates,lows,c= 'blue') #更改颜色为蓝色,便于区分
添加最低气温后的图表显示如下:
4.更好地显示图表--给图表区域上色
只需更改三处代码 (alpha是透明度),fill_between()填充两条折现之间的区域.
plt.plot(dates,highs,c='red',alpha=0.5)
plt.plot(dates,lows,c= 'blue',alpha=0.5)
plt.fill_between(dates, highs, lows,facecolor='blue', alpha=0.1)
结果如下:
5.错误检查
csv文件中有时会出现一些意料之外的东西,有时会导致错误。
用try,except,else结构来避免错误。
举例:
我试图用同样的方法分析death_valley_2014.csv时,出现了错误。
上面提示我,在30行,执行语句 high=int(row[1])时出现错误,错误类型为ValueError,提示无法将''转化成int。
于是用 try ,except,else结构来避免这种ValueError.
我们将可能出错的部分放在try的内部
except ValueError :在出错时打印一条信息,
else:来执行正常的时候的操作。
for row in reader: try: current_date = datetime.strptime(row[0],"%Y-%m-%d") high = int(row[1]) low = int(row[3]) except ValueError: print(current_date, 'missing data') else: dates.append(current_date) highs.append(high) lows.append(low)
结果如下:
可以看出,不仅成功地绘制出了折线图,而且打印出了出现错误时的日期。
最后,最终的完整代码:
#导入csv模块 import csv #导入datetime from datetime import datetime # from matplotlib import pyplot as plt #指定文件名,然后使用 with open() as 打开 filename = 'death_valley_2014.csv' with open(filename) as f: #创建一个阅读器:将f传给csv.reader reader = csv.reader(f) #使用csv的next函数,将reader传给next,将返回文件的下一行 header_row = next(reader) # for index, column_header in enumerate(header_row): #print(index, column_header) #读取最高气温 #创建最高气温的列表 highs =[] lows= [] dates = [] #遍历reader的余下的所有行(next读取了第一行,reader每次读取后将返回下一行) for row in reader: try: current_date = datetime.strptime(row[0],"%Y-%m-%d") high = int(row[1]) low = int(row[3]) except ValueError: print(current_date, 'missing data') else: dates.append(current_date) highs.append(high) lows.append(low) #绘制图形 fig = plt.figure(dpi=128, figsize=(10,6)) plt.plot(dates,highs,c='red',alpha=0.5) plt.plot(dates,lows,c= 'blue',alpha=0.5) plt.fill_between(dates, highs, lows,facecolor='blue', alpha=0.1) #设置图形的格式 plt.title("Daily high and low temperature, 2014", fontsize=24) plt.xlabel('',fontsize=16) fig.autofmt_xdate() plt.ylabel("Temperature(F)", fontsize=16) plt.tick_params(axis='both', which="major", labelsize=16) plt.show()