使用Python进行数据可视化(三、处理csv文件(二),更好地显示,更多的信息,错误检查)

在"使用Python进行数据可视化(三、处理csv文件)"中,我们成功地从csv文件中获取了最高气温的信息,并且绘制了一个直观的折线图。接下来,我们还可以添加一些东西,使其显示更多的信息。

1.显示日期、时间信息

模板 datetime

datetime.datetime

在Python的官方文档中search datetime可以找到关于datetime的使用说明。

class datetime.datetime(yearmonthdayhour=0minute=0second=0microsecond=0tzinfo=None*fold=0)

......

我们要用到的是:

strptime()

classmethod  datetime. strptime ( date_stringformat )

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()

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()


猜你喜欢

转载自blog.csdn.net/qq_41068877/article/details/80663689