数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化

目录

    • 一、前提准备
    • 二、代码解释
      • 2.1分析CSV文件头
      • 2.2提取并读取数据
      • 2.3绘制气温图表
      • 2.4在图表中添加日期(datetime模块)
        • 2.4.1书上源代码
        • 2.4.2完善代码
      • 2.5覆盖更广的时间
        • 2.5.1书上源代码
        • 2.5.2完善代码
      • 2.6再绘制一个数据系列--添加最低气温数据
        • 2.6.1添加最低气温数据
        • 2.6.2给图表区域着色
      • 2.7错误检查---异常处理

一、前提准备

建立一个文件夹,如图所示,里面包含三个csv文件,我在百度网盘里面分享出来了,可以点击下载
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第1张图片

百度网盘:数据文件
链接:点击此处
提取码:cin1

二、代码解释

2.1分析CSV文件头

header_row.py

# coding = utf-8

import csv

"""分析CSV文件头"""

filename = 'sitka_weather_07-2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 调用enumerate获取每个元素的索引及其值
    for index, colum_header in enumerate(header_row):
        print(index, colum_header)

运行结果

数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第2张图片
注意:
AKDT=阿拉斯加时间(Alaska Daylight Time)

2.2提取并读取数据

max_temperature.py

# coding = utf-8

import csv

"""提取并读取数据:读取每天的最高气温"""

filename = 'sitka_weather_07-2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建一个为max_temperature的空列表
    max_temperature = []
    # 遍历文件中余下的各行
    for row in reader:
        #每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

    print(max_temperature)

运行结果
在这里插入图片描述

2.3绘制气温图表

temperature_chart.py

# coding = utf-8

import csv
from matplotlib import pyplot as plt

"""提取并读取数据:读取每天的最高气温"""

filename = 'sitka_weather_07-2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建一个为max_temperature的空列表
    max_temperature = []
    # 遍历文件中余下的各行
    for row in reader:
        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

	"""根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将最高气温传给plot
    plt.plot(max_temperature, c='blue')

    # 设置图形的格式
    plt.title("Daily max temperature,july 2014", fontsize=24)
    plt.xlabel('', fontsize=16)
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第3张图片

2.4在图表中添加日期(datetime模块)

模块datetime中设置日期和时间格式的参数(常用):点击此处

2.4.1书上源代码

chart_addtime.py

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime

"""提取并读取数据:读取每天的最高气温"""

filename = 'sitka_weather_07-2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature = [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='blue')

    # 设置图形的格式
    plt.title("Daily max temperature,july 2014", fontsize=24)
    plt.xlabel('', fontsize=16)
    #使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第4张图片
注意上面是书上的代码运行之后的原图

2.4.2完善代码

我花了快一天的时间在网上查资料,咋改这东西才能跟书上的图片一模一样,运行书上的代码,我真的醉了我去。以下是更改过后的代码:

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime
from matplotlib import dates as mdates

"""提取并读取数据:获取日期和最高气温"""

filename = 'sitka_weather_07-2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature = [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red')

    # 设置图形的格式
    plt.title("Daily max temperature,July 2014", fontsize=24)
    # 设置横坐标日期的上下限
    plt.xlim([datetime(2014, 7, 1), datetime(2014, 7, 31)])  # 日期上下限
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %d %Y'))  # 日期格式,%B为月份名,%b为月份名缩写
    plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=3))  # 日期间隔
    plt.xlabel('', fontsize=16)
    # 使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()

    # 温度上下限和间隔
    plt.yticks(range(54, 74, 2))
    plt.ylabel('Temperature(F)', fontsize=16)
    # pyplot模块中的tick_params()方法可以修改坐标刻度,刻度标签和网格线的外观
    plt.tick_params(axis='both', which='major', direction='in', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第5张图片

2.5覆盖更广的时间

2.5.1书上源代码

这里只需要将表名filename改一下就行了,当然也可以更改一下标题,我这里还改了颜色为red
complete_chart.py

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime

"""提取并读取数据:获取日期和最高气温"""

filename = 'sitka_weather_2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature = [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red')

    # 设置图形的格式
    plt.title("Daily max temperature,--2014", fontsize=24)
    plt.xlabel('', fontsize=16)
    #使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第6张图片

2.5.2完善代码

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime
from matplotlib import dates as mdates

"""提取并读取数据:获取日期和最高气温"""

filename = 'sitka_weather_2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature = [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red')

    # 设置图形的格式
    plt.title("Daily max temperature,2014", fontsize=24)
    # 设置横坐标日期的上下限
    plt.xlim([datetime(2014, 1, 1), datetime(2014, 12, 22)])  # 日期上下限
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))  # 日期格式,%B为月份名,%b为月份名缩写
    plt.xlabel('', fontsize=16)
    # 使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()

    # 温度上下限和间隔
    plt.yticks(range(20, 80, 5))
    plt.ylabel('Temperature(F)', fontsize=16)
    # pyplot模块中的tick_params()方法可以修改坐标刻度,刻度标签和网格线的外观
    plt.tick_params(axis='both', which='major', direction='in', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第7张图片

2.6再绘制一个数据系列–添加最低气温数据

2.6.1添加最低气温数据

high_low_chart.py

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime
from matplotlib import dates as mdates

"""提取并读取数据:获取日期和最高气温和最低气温"""

filename = 'sitka_weather_2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature, min_temperature = [], [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

        min = int(row[3])
        min_temperature.append(min)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red')
    plt.plot(dates, min_temperature, c='green')

    # 设置图形的格式
    plt.title("Daily max temperature and min temperature,2014", fontsize=24)
    # 设置横坐标日期的上下限
    plt.xlim([datetime(2014, 1, 1), datetime(2014, 12, 22)])  # 日期上下限
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))  # 日期格式,%B为月份名,%b为月份名缩写
    plt.xlabel('', fontsize=16)
    # 使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()

    # 温度上下限和间隔
    plt.yticks(range(20, 80, 5))
    plt.ylabel('Temperature(F)', fontsize=16)
    # pyplot模块中的tick_params()方法可以修改坐标刻度,刻度标签和网格线的外观
    plt.tick_params(axis='both', which='major', direction='in', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第8张图片

2.6.2给图表区域着色

high_low_chart.py

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime
from matplotlib import dates as mdates

"""提取并读取数据:获取日期和最高气温和最低气温"""

filename = 'sitka_weather_2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature, min_temperature = [], [], []
    # 遍历文件中余下的各行
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        dates.append(current_date)

        # 每次执行该循环时,我们都将索引1(第二列)的数据附加到max_temperature的末尾
        max = int(row[1])
        max_temperature.append(max)

        min = int(row[3])
        min_temperature.append(min)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red', alpha=0.5)
    plt.plot(dates, min_temperature, c='green', alpha=0.5)
    #中间传红色哈哈哈哈
    plt.fill_between(dates, max_temperature, min_temperature, facecolor='pink', alpha=0.8)

    # 设置图形的格式
    plt.title("Daily max temperature and min temperature,2014", fontsize=24)
    # 设置横坐标日期的上下限
    plt.xlim([datetime(2014, 1, 1), datetime(2014, 12, 22)])  # 日期上下限
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))  # 日期格式,%B为月份名,%b为月份名缩写
    plt.xlabel('', fontsize=16)
    # 使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()

    # 温度上下限和间隔
    plt.yticks(range(20, 80, 5))
    plt.ylabel('Temperature(F)', fontsize=16)
    # pyplot模块中的tick_params()方法可以修改坐标刻度,刻度标签和网格线的外观
    plt.tick_params(axis='both', which='major', direction='in', labelsize=16)

    plt.show()

运行结果
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第9张图片

2.7错误检查—异常处理

将high_low_chart.py的第十行filename改为death_valley_2014.csv,如在这里插入图片描述
运行的时候就会报错:

Traceback (most recent call last):
  File "F:/Z/Python/project/project2/csva/high_low_chart.py", line 28, in <module>
    max = int(row[1])
ValueError: invalid literal for int() with base 10: ''

如图:
在这里插入图片描述
报错原因:ValueError:基为10的int()的文本无效:“” ,说明death_valley_2014.csv文件中存在空字符串
death_valley_2014.csv中发现2014-2-16这一天
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第10张图片
因此,我们就需要进行异常处理
异常处理

# coding = utf-8

import csv
from matplotlib import pyplot as plt
from datetime import datetime
from matplotlib import dates as mdates

"""提取并读取数据:获取日期和最高气温和最低气温,异常处理"""

filename = 'death_valley_2014.csv'

# 打开这个文件,将文件对象存储在f中
with open(filename) as f:
    # 创建一个与该文件相关联的阅读器
    reader = csv.reader(f)

    # 返回文件的下一行,前面的代码中,我们只调用了next()一次,因此得到的是文件第一行
    header_row = next(reader)

    # 创建两个为dates和max_temperature的空列表,用来存储从文件中提取的日期和最高气温
    dates, max_temperature, min_temperature = [], [], []
    # 遍历文件中余下的各行
    for row in reader:
        try:
            current_date = datetime.strptime(row[0], "%Y-%m-%d")
            max = int(row[1])
            min = int(row[3])
        except ValueError:
            print(current_date, 'missing data')
        else:
            dates.append(current_date)
            max_temperature.append(max)
            min_temperature.append(min)

    """根据数据绘制图形"""
    # dpi:每英寸的点数 figsize:宽高
    fig = plt.figure(dpi=100, figsize=(10, 6))
    # 将日期和最高气温传给plot
    plt.plot(dates, max_temperature, c='red', alpha=0.5)
    plt.plot(dates, min_temperature, c='green', alpha=0.5)
    #中间传红色哈哈哈哈
    plt.fill_between(dates, max_temperature, min_temperature, facecolor='pink', alpha=0.8)

    # 设置图形的格式
    plt.title("Daily max temperature and min temperature,2014", fontsize=24)
    # 设置横坐标日期的上下限
    plt.xlim([datetime(2014, 1, 1), datetime(2014, 12, 22)])  # 日期上下限
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))  # 日期格式,%B为月份名,%b为月份名缩写
    plt.xlabel('', fontsize=16)
    # 使用autofmt_xdate来绘制倾斜的日期标签,以免彼此重叠
    fig.autofmt_xdate()

    # 温度上下限和间隔
    plt.yticks(range(20, 80, 5))
    plt.ylabel('Temperature(F)', fontsize=16)
    # pyplot模块中的tick_params()方法可以修改坐标刻度,刻度标签和网格线的外观
    plt.tick_params(axis='both', which='major', direction='in', labelsize=16)

    plt.show()

运行结果
在这里插入图片描述
数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化_第11张图片
学习《python编程从入门到实战》16章第一节,通过敲这些代码,发现一句真理:实践是检验真理的唯一标准!
书上的源码有些不足,我以为是我哪里代码打错了,检查了不下三遍,也可真够有耐烦心的,完善代码给整了一天,不过这也锻炼了自己的能力哈哈哈哈!
以上就是全部内容啦,如果有不懂的小伙伴欢迎提出来傲!

你可能感兴趣的:(Python,数据分析,python,数据分析,csv)