在"使用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()