关于如何使用 python 下载CSV格式数据

news2024/12/22 23:49:47

本章节内容节自《python 编程从入门到实践》第十六章,我们将从网络上下载数据,并对数据进行可视化。就可以对其进行分析甚至观察其规律和关联。

学习目标

我们将访问并可视化以下两种常见格式存储的数据:

  1. CSV

    使用 Python 模块 CSV 来处理以 CSV格式存储的天气数据,找出两个不同地区在同一个时间段内的最高气温和最低温度。然后 使用 matplotlib 根据下载的数据创建一个图表,展示两个不同地区的气温变化

  2. JSON
    使用 Python 模块 json来访问 JSON格式存储的交易收盘价格数据,并使用Pygal 绘制图形以探索价格变化的周期性

1. CSV 文件格式

要在文本文件中存储数据,最简单的方式:

将数据作为一系列以逗号分隔的值(CSV)写入文件。这样的文件称为 CSV 文件。

例如:

2023-5-14,19,99,12,12,1,2,3,4,5,6,7,8,9,1.0,1.1,1.2,,,,,2.3

虽然 CSV 文件对人来说阅读起来比较麻烦,但程序可以轻松地提取并处理其中的值,这有助于加快数据分析过程。

我们首先处理少量 CSV 格式的天气数据:

这些数据存储在: sitka_weather_07-2014.csv 中,需要将其复制到程序所在的文件夹中。

在这里插入图片描述
在这里插入图片描述

如果你没有练习资料,也没关系,我已经将其上传到个人资源中,可以到我的个人主页中下载。

我发布的所有内容,即便对你无益,却都是我学到的,无需任何浏览条件。
我分享的所有文件,即便对你无用,却都是无任何下载条件的。

在这里插入图片描述
在这里插入图片描述

准备阶段的内容已经彻底完成了,下面我们开始正式进入到学习状态:

1.1 分析 CSV 文件头

csv 模块包含在 python 标准库中,可用于分析 CSV 文件中的数据行。

下面我们来查看这个文件的第一行,其中包含一系列有关数据的描述:

highs_lows.py:

import csv

filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    print(header_row)

代码片段说明:

我们先导入了 csv模块。
然后将要是有的文件 存储到一个名为 filename 的变量当中。接下来去打开这个文件,并将其结果对象存储在 f 中,然后在调用 svc.reader(),将前面存储的文件作为实参传递给它,从而创建一个与该文件相关联的阅读器。
我们将这个阅读器存储对象存储在 reader 中。

调用的 next() 函数,包含自 : reader 类。
调用 reader 内置的 next 方法并将reader 作为参数传递给它时,会返回文件中的下一行。

我们先执行程序看一下运行效果:
在这里插入图片描述

的确如实读出来文件的第一行内容了。

因为我们只调用了一次 next() 函数,所以只读出来了一行内容。

reader 处理文件中以逗号分隔的每一行数据,并将每项数据都作为一个元素存储到列表中。

1.2 打印文件头及其位置

为了让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:
fighs_lows.py:

这里我们需要使用一下 enumerate() 函数,用其获取每个元素的索引及其值。

import csv

filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    #print(header_row)

    for index,column_header in enumerate(header_row):
        print(index,column_header)

程序执行完成后是这样的:
在这里插入图片描述

这里删除了第一个用于打印reader.next读取文件内容信息的print语句。
然后对列表调用 enumerate() 函数,这个函数的作用:获取每个元素的索引及其值。最后 print 一下 存储文件下一行内容的 header_row 变量。

1.3 提取并读取数据

现在,我们能将数据读取出来了。现在要做的就是可以将读取数据中提取出来自己需要的。

filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    print(header_row)

	highs = []
    for row in reader:
        highs.append(row[1])
    print(highs)

在这里我们创建了一个名为 highs的空列表。然后遍历文件中余下的各行。阅读器对象从其停留的地方继续向下读取。且每次都会返回当前所处位置的下一行。
由于我们之前读取了文件头行,所以这里会从第二行开始读取。每次执行循环时都会将索引1处也就是第二列的数据附加到highs的末尾处。

执行效果:
在这里插入图片描述

下面我们使用 int() 将这些数字提取为数字,让 matplotlib 能够提取他们:

highs = []
for row in reader:
	high = int(row[1])
	highs.apped(high)
print(highs)

在这里插入图片描述

然后是将其可视化:

1.4 绘制气温图表

使用 matplotlib 绘制一个显示每日最高气温的图像:
highs_lows_mp:

import csv
from matplotlib import pyplot as plt

#从文件中获取最高气温
filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)
   print(header_row)

   highs = []
   for row in reader:
       high = int(row[1])
       highs.append(high)
   print(highs)


#根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(highs,c='red')
#设置图形格式
plt.title("Daily high temperatures, July 2014",fontsize = 24)
plt.xlabel('',fontsize=16)
plt.xlabel("Temperature(F)",fontsize =16)
plt.tick_params(axis='both',which='major',labelsize =16)
plt.show()

在这里插入图片描述

1.5 模块 datetime

我们的 sitka_weather_01-2014.csv 文件内容是这样的:

在这里插入图片描述
在这个文件中,第一行数据相当于所有数据的标题。
从第二行开始,才是具体的时间数据。

下面开始在图表中添加日期,使其更有用。
想读取时间数据时,获得的是一个字符串,因为我们需要想办法将字符串’2017-7-1’转换为一个表示相应日期的对象。为创建一个表示2014年7月1日的对象,可以使用 模块datetime 中的方法 strptime()。

使用示例:

from datetime import datetime as dt
first_time = dt.strptime('2014-7-1','%Y-%m-%d')
print(first_time)

其效果是这样的:
在这里插入图片描述

这里:我们首先创建了一个 datetime中的 datetime 类,然后调用它的 strptime() 方法,并且将包含所需日期的字符串作为第一个参数。第二个实参告诉 python 如何设置日期的格式。
.
‘%Y-’ 表示将字符串中的第一个连字符前面的部分视为四位的年份。
‘%m-’ 表示见字符串中的第二个连字符前面的部分视为月份的数字。
‘%d’ 让python 将字符串中的最后一个连字符部分视为月份中的第一天。

strptime() 可接受的参数:
实参含义
%A星期的名称。如Monday
%B月份名。 如January
%m用数字表示的月份(01~12)
%d用数字表示月份中的一天(01~31)
%Y四位的年份。如2023
%y两位的年份。如23
%H24小时制的小时数
%I12小时制的小时数
%pam 或 pm
%M分钟数。(00~59)
%S秒数。(00~60)
1.6 在图标中添加日期

现在知道了如何处理 CSV文件中的日期后。就可以对气温图形进行改进了。
即提取日期和最高气温,并将它们传递给plot()。

highs_lows_mp.py:

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

#从文件中获取最高气温
filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)
   print(header_row)

   dates,highs = [],[]
   for row in reader:
       current_date = dt.strptime(row[0],"%Y-%m-%d")
       dates.append(current_date)

       high = int(row[1])
       highs.append(high)
   print(highs)


#根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red')
#设置图形格式
plt.title("Daily high temperatures, July 2014",fontsize = 24)
plt.xlabel('',fontsize=16)
fig.autofmt_xdate()
plt.xlabel("Temperature(F)",fontsize =16)
plt.tick_params(axis='both',which='major',labelsize =16)
plt.show()

在这里插入图片描述

这次我们创建了两个空列表,用于存储从文件中提取的日期和最高气温。然后,我们将包含日期信息的数据(row[0])转换为datetime对象,并将其附加到列表dates末尾。
然后将日期和最高气温值传递给 plot()。在调用 fig.autofmt_xdate()来绘制斜的日期标签,以免它们被重叠。

1.7 涵盖更长的时间

现在我们要在图表上添加更多的数据。 以 一座城市的天气图为例。

先将 sitka_weather_2014.csv 文件放到本程序所在的文件夹当中,该文件包含 某城市的一整年天气数据。

在这里插入图片描述
在这里插入图片描述
放好之后,我们该开始思考怎么用代码将这些数据绘制成图了:

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

#从文件中获取最高气温
filename = 'sitka_weather_2014.csv'

with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)
   print(header_row)

   dates,highs = [],[]
   for row in reader:
       current_date = dt.strptime(row[0],"%Y-%m-%d")
       dates.append(current_date)

       high = int(row[1])
       highs.append(high)
   print(highs)


#根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red')
#设置图形格式
plt.title("Daily high temperatures - 2014",fontsize = 24)
plt.xlabel('',fontsize=16)
fig.autofmt_xdate()
plt.xlabel("Temperature(F)",fontsize =16)
plt.tick_params(axis='both',which='major',labelsize =16)
plt.show()

其实这段代码和前面的示例别无区别。只是更改了所要读取的目标文件。其次就是还修改了绘制图表的标题。

1.8 再绘制一个数据系列

现在需要从数据文件中提取最低气温,并将它们添加到图表中。

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

#从文件中获取最高气温
filename = 'sitka_weather_2014.csv'

with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)
   print(header_row)

   dates,highs,lows = [],[],[]
   for row in reader:
       current_date = dt.strptime(row[0],"%Y-%m-%d")
       dates.append(current_date)

       high = int(row[1])
       highs.append(high)

       low = int(row[3])
       lows.append(low)
   print(highs)


#根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red')
#设置图形格式
plt.title("Daily high temperatures - 2014",fontsize = 24)
plt.xlabel('',fontsize=16)
fig.autofmt_xdate()
plt.xlabel("Temperature(F)",fontsize =16)
plt.tick_params(axis='both',which='major',labelsize =16)
plt.show()

在这里插入图片描述

1.9 给图表区域着色

通过添加两个数据系列后,可以了解每天的气温范围。
下面来给这个图表最后的修饰,通过着色来呈现每天的天气范围。

fill_between()
它接受一个x值系列和两个值系列,并填充两个y值系列之间的空间:

plt.plot(dates,highs,c='red',alpha =0.5)
plt.plot(dates,lows,c='red',alpha =0.5)
plt.fill_between(dates,highs,lows,facecolor ='blue',alpha =0.1)

在这里插入图片描述

alpha 指定颜色的透明度。0表示完全透明,1表示完全不透明。
设置为0.5,可让红色和蓝色都看起来更浅。
.
fill_between() 说明:
这里我们传递的x值系列为 列表 dates,传递的两个y值分别为:highs,lows。实参facecolor指定了填充区域的颜色。

1.10 错误检查

这是关于 处理CSV格式的最后一小节内容。

现在程序的状态为: 我们使用 highs_lows.py中写好的逻辑来读取文件:sitka_weather_2014.csv 中的数据。

但如果,我们不想读取这个文件中的数据了。

首先要做的就是更改程序中定义好的文件的名字:
将 titak_weather_2014.csv 更改为 death_valley_2014.csv

然后运行程序,开始读取数据:

运行结果报错了,其信息显示如下
在这里插入图片描述

出现这个bug的原因源于:

python 无法处理其中一天的最高气温,因为它无法将空字符串(’ ') 转换为整数。

现在,我们知道了原因,但是为了确凿事实,在去看一下所读取文件的内容:
在这里插入图片描述

为了解决这个问题,我们可以在代码程序中加入异常处理:

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

#从文件中获取最高气温
filename = 'death_valley_2014.csv'

with open(filename) as f:
   reader = csv.reader(f)
   header_row = next(reader)
   #print(header_row)

   dates,highs,lows = [],[],[]

   for row in reader:
       try:
            current_date = dt.strptime(row[0],"%Y-%m-%d")
            high = int(row[1])
            low = int(row[3])
       except ValueError:
           print(current_date,'missing date')
       else:
           dates.append(current_date)
           highs.append(high)
           lows.append(low)
   #print(highs)


#根据数据绘制图形
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha =0.5)
plt.plot(dates,lows,c='red',alpha =0.5)
plt.fill_between(dates,highs,lows,facecolor ='blue',alpha =0.1)
#设置图形格式
plt.title("Daily high temperatures - 2014",fontsize = 24)
plt.xlabel('',fontsize=16)
fig.autofmt_xdate()
plt.xlabel("Temperature(F)",fontsize =16)
plt.tick_params(axis='both',which='major',labelsize =16)
plt.show()

添加了异常处理之后,我们的程序又能正常运行了:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试2年,26岁大龄程序员面试13家公司,拿下25K,差点被面试官KO了···

前言 我大概面试了13家公司,简历包装的是两年半测试经验,因为我的年纪已经是26岁,所以必须进行包装,这也并不是我想欺骗别人,而是现在无论干什么工作都需要有工作经验的,就连找个销售都要有工作经验的&…

Vue绑定class样式与style样式

1,回顾HTML的class属性 答:任何一个HTML标签都能够具有class属性,这个属性可能只有一个值,如class"happs",也有可能存在多个属性值,如class"happs good blue",js的原生DOM针…

STM32开发踩坑——芯片写保护解除

成立这个专栏的目的是,记录自己嵌入式开发遇到的问题,与成功的解决方法,方便自己回顾。 具体参考链接:STM32的Flash写了保护怎么办? 解决方法:在STLink连接目标板的情况下打开程序烧写软件ST-Link Utilit…

低代码开发迎来设备管理新时代:智能制造加速升级

随着智能制造时代的到来,制造业正在经历一场前所未有的变革。在这场变革中,设备管理平台和低代码开发已经成为了制造业的不二利器,帮助企业实现数字化转型,提高生产效率,降低成本,增强竞争力。 一、设备管…

OptaPlanner 中的hello world项目实战

实际操作步骤: 1.代码下载 下载下来的文件目录 2.使用编辑器打开hello-world项目 3.进行配置 配置JDK ,File——》Settings File——》Project Structure 配置maven 说明:不用下载新的maven,用工具自带的,需要将sett…

旋翼无人机常用仿真工具

四旋翼常用仿真工具 rviz: 简单的质点(也可以加上动力学姿态),用urdf模型在rviz中显示无人机和飞行轨迹、地图等。配合ROS代码使用,轻量化适合多机。典型的比如浙大ego-planner的仿真: https://github.c…

screen 的介绍及用法

screen 是什么 screen 是一种类似于终端模拟器的程序,允许你在一个终端窗口中创建和使用多个会话。这对于同时运行多个命令或任务非常有用,这样你就可以轻松地在它们之间切换,而不必依赖于多个终端窗口。此外,如果在ssh会话中运行…

HDMI之带宽计算

基本概念 像素时钟 英文 A pixel clock, also known as a dot clock, is a term commonly used in computer graphics and video display systems. It refers to the frequency at which pixels are displayed on a screen or monitor. The pixel clock determines the speed…

VMware是什么?VMware虚拟机最新安装教程

VMware Workstation是一款虚拟机软件,允许用户将Linux、Windows等多个操作系统作为虚拟机在单台PC上运行; 用户可以在虚拟机上重现服务器、桌面和平板电脑环境,无需重新启动即可跨不同操作系统同时运行应用。 通过对个人笔记本(PC)硬件资源的虚拟&#…

【zmq】REQ REP 模式

[c代码(https://github.com/dongyusheng/csdn-code/tree/master/ZeroMQ)zguide 官方有c++发布订阅:可以使用信封 发布订阅可以让消息一直流动请求应答是双向的,但是必须请求 应答 请求 应答 循环。简单的请求应答 requester 作为客户端以tcp连接到 reponderrequester zmq_sen…

自动化测试用例怎么写?最全自动化测试用例设计编写指南...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

算法系列题目

文章目录 一. 下一个更大元素1. 下一个更大元素 Ⅰ2. 下一个较大元素II 二. 区间问题1. 贪心策略最少射箭问题无重叠区间合并区间划分字母区间 2. 差分数组 三. 设计类题目1. LRU(最近最少使用)缓存2. LFU(最不经常使用)缓存 一. 下一个更大元素 1. 下一个更大元素 Ⅰ 添加链…

磐维数据库panweidb单节点服务器在centos7.9安装(研发环境)

一、系统环境优化 1.1 关闭SELINUX # 修改配置文件 cat /etc/selinux/config | grep -i SELINUX SELINUXdisabled# 关闭SELINUX setenforce 0 1.2 内核参数优化 vi /etc/sysctl.conf 添加# panweidb net.ipv4.tcp_max_tw_buckets 10000 net.ipv4.tcp_tw_reuse 1 net.ipv4.t…

CAS是什么?它的底层原理是什么?

目录 一、CAS概述 二、底层原理 三、总结 一、CAS概述 CAS(Compare and Swap)比较和交换:是一种并发算法,也是一种乐观锁,从JDK5开始,jdk提供了java.util.concurrent.*,此包下面的类在高并发场景下经常使用…

CTF密码学总结

0x01 目录 常见编码: ASCII编码Base64/32/16编码shellcode编码Quoted-printable编码XXencode编码UUencode编码URL编码Unicode编码Escape/Unescape编码HTML实体编码敲击码(Tap code)莫尔斯电码(Morse Code)编码的故事 各种文本加密 换位加密: 栅栏密码(Rail-fence Cipher)曲路密…

第13届蓝桥杯Scratch选拔赛真题集锦

第13届蓝桥杯Scratch选拔赛真题集锦 编程题 第 1 题问答题 跳舞机游戏 题目说明 编程实现 跳舞机游戏。 具体要求: 1).点击绿旗,舞台左上角显示得分0代表玩家分数,在得分右侧倒计时10代表游戏时长(10s) 2).游戏开始倒数计时,在舞台上随…

目标检测的通用实例提取

论文:General Instance Distillation for Object Detection 论文地址:https://arxiv.org/pdf/2103.02340.pdfhttps://arxiv.org/pdf/2103.02340.pdf 摘要 In recent years, knowledge distillation has been proved to be an effective solution for m…

vulnhub靶场之bassamctf

1.信息收集 探测存活主机,输入:netdiscover -r 192.168.239.0/24 ,发现192.168.239.177存活。 对目标主机192.168.239.176进行端口扫描,发现存活22(SSH)、80端口。 在浏览器上输入:http://192.168.239.177&#xff…

网络协议 | 典型协议、B/S模式、C/S模式

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

LeetCode:29. 两数相除

29. 两数相除 1)题目2)思路3)代码1.初始代码2.第一次优化3.第二次优化 4)结果1.初始结果2.第一次优化结果3.第二次优化结果 1)题目 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,…