增加一个容错判断,如果找不到数据,则抛出异常,,也可以用remove()或del将已提取的数据删除
import csv
import matplotlib.pyplot as plt
from datetime import datetime
# 设置字体
# plt.rcParams['font.sans-serif'] = ['SimHei'] # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体
# plt.rcParams['font.size'] = 12 # 字体大小
# plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# file = 'data/sitka_weather_07-2018_simple.csv'
file = 'data/death_valley_2018_simple.csv'
with open(file) as f:
reader = csv.reader(f)
header_row = next(reader) # 滚动到下一行
# print(header_row)
# 在循环中,对列表调用了enumerate()来获取每个元素的索引及其值。
for index, column_header in enumerate(header_row):
print(index, column_header)
# 从文件中获取最高温度。
# 创建一个名为highs的空列表,再遍历文件中余下的各行)。
# 阅读器对象从其停留的地方继续往下读取CSV文件,每次都自动返回当前所处位置的下一行。
# 由于已经读取了文件头行,这个循环将从第二行开始——从这行开始包含的是实际数据。每次执行循环时,都将索引5处(TMAX列)的数据附加到highs末尾。
# 在文件中,这项数据是以字符串格式存储的,因此在附加到highs末尾前,使用函数int()将其转换为数值格式,以便使用。
dates, highs, lows = [], [], [] # 一个日期数组x轴,一个温度值数组y轴
for row in reader:
current_date = datetime.strptime(row[2], '%Y-%m-%d') # 格式化日期事件
# 增加一个容错判断,如果找不到数据,则抛出异常,,也可以用remove()或del将已提取的数据删除
try:
high = int(row[4])
low = int(row[5])
except ValueError:
print(f"找不到数据 {current_date}")
else:
dates.append(current_date)
highs.append(high)
lows.append(low)
print(dates)
print(highs)
print(lows)
# 根据最高温度绘制图形。
# 图形的类型
plt.style.use('seaborn')
# plt.subplots()是一个返回包含图形和轴对象的元组的函数.因此,在使用时fig, ax = plt.subplots(),
# 将此元组解压缩到变量fig和ax.有fig,如果你想改变人物级别的属性或保存数字作为以后的图像文件是非常有用的
fig, ax = plt.subplots()
# 将最高温度列表传给plot(),并传递c='red'以便将数据点绘制为红色。
# 实参alpha指定颜色的透明度。alpha值为0表示完全透明,为1(默认设置)表示完全不透明。
# 通过将alpha设置为0.5,可让红色和蓝色折线的颜色看起来更浅。
ax.plot(dates, highs, c='red', alpha=0.5) # 最 高 温度
ax.plot(dates, lows, c='blue', alpha=0.5) # 最 低 温度
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
# 设置图形的格式。
ax.set_title("2018加利福尼亚 死亡山谷最高气温", fontsize=24)
ax.set_xlabel('', fontsize=16)
fig.autofmt_xdate() # 调用fig.autofmt_xdate()来绘制倾斜的日期标签,以免其彼此重叠。
ax.set_ylabel("温度(F)", fontsize=16)
# axis : 可选{‘x’, ‘y’, ‘both’} ,选择对哪个轴操作,默认是’both’
# which : 可选{‘major’, ‘minor’, ‘both’} 选择对主or副坐标轴进行操作
# labelsize : float/str, 刻度值字体大小
ax.tick_params(axis='both', which='major', labelsize=16)
plt.show()