0 python csv diagram graph matplotlib
这是我第一次在这个论坛上提问,希望不要出丑。我是一名 IT 教育专业的学生,今天向我简要介绍了 CSV 和 Matplotlib 库。任务是制作一个图表/图表,显示该 CSV 文件中的最高和最低温度以及相应的日期。我需要行号,并且需要程序来理解单元格的正确格式/语法,但我真的不知道如何做。
此处的 CSV 文件示例:"STATION","NAME","DATE","PRCP","TMAX","TMIN","TOBS" "USC00042319","DEATH VALLEY, CA US","2018-01- 01","0.00","65","34","42" "USC00042319","死亡谷,美国加利福尼亚州","2018-01-02","0.00","61","38", "46" "USC00042319","美国加利福尼亚州死亡谷","2018-01-03","0.00","69","34","54" "USC00042319","美国加利福尼亚州死亡谷", "2018-01-04","0.00","69","39","48" "USC00042319","死亡谷,美国加利福尼亚州","2018-01-05","0.00","74" ,"40","57" "USC00042319","死亡谷,美国加利福尼亚州","2018-01-06","0.00","74","47","65" "USC00042319","死亡谷,美国加利福尼亚州”,“2018-01-07”,“0.00”,“77”,“54”,“60”“USC00042319”,“死亡谷,美国加利福尼亚州”,“2018-01-08”,“0.07 ","62","52","52" "USC00042319","死亡谷,美国加利福尼亚州","2018-01-09","0.40","60","51","51" "USC00042319 ","美国加利福尼亚州死亡谷","2018-01-10","0.00","64","49","50"
这就是我得到的:
import csv
import matplotlib.pyplot as plt
filename = 'death_valley_2018_simple.csv'
with open(filename) as f:
csv_reader = csv.reader(f, delimiter=',')
line_count = 0
for row in f:
x=(row[4], row[5])
y=(row[2])
print(row[2])
print(row[4])
print(row[5])
plt.bar(x,y)
plt.xticks(y)
plt.ylabel('Dates')
plt.title('Plot')
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果是这个“条形图” 我从这里阅读了其他论坛帖子,在 Discord 上询问并阅读了 CSV 文档。也许答案就在那里,但我当时不明白。我希望有人能像我 5 岁一样向我解释这一点。
不用担心; 我接到你了。但首先是一些建议。我记得当我在这个论坛上发布第一个问题时,我不知道如何提问(而且当时我的英语不太好)。提出完美问题的关键是首先进行搜索(您已经这样做了),然后如果您没有找到答案,则应该尽可能清晰、尽可能简短地提出问题。我并不是说不要提供足够的信息,但如果您可以用更少的词语提出问题并且您的问题仍然尽可能清晰,那么您应该这样做。为什么?因为事实是,如果问题很长,很多人都会跳过。刚才,当我打开你的问题并看到这些行时,我有点害怕并想跳过它:D,但我在几分钟内解决了它,而且一点也不可怕。我不太关心写长答案,因为那些有问题的人会在必要时阅读你的答案。请注意,所有这些只是我的个人经历。您还应该寻找更好的初学者指南来在此论坛和类似平台上提问。我的建议:http ://www.catb.org/~esr/faqs/smart-questions.html
我更csv喜欢使用pandas. pandas将使您的生活更加轻松。但你必须先安装它:
pip install pandas
Run Code Online (Sandbox Code Playgroud)
现在很简单,让我们导入所有内容并加载文件csv。
import pandas as pd
import matplotlib.pyplot as plt
filename = 'death_valley_2018_simple.csv'
dataframe = pd.read_csv(filename)
Run Code Online (Sandbox Code Playgroud)
dataframe包含csv文件的行和列。我们需要将DATE列从转换str为datetime。
dataframe["DATE"] = pd.to_datetime(dataframe['DATE'], format="%Y-%m-%d")
Run Code Online (Sandbox Code Playgroud)
所以我们只是告诉 pandas 将DATE列更改为datetime,并且通过指定格式字段来告诉年月日的数字在哪里。%Y 代表年份,然后是破折号,%m 代表月份,还有……,我们使用大写 Y,因为 %y 代表年份,而我们在右侧只有两位数字。在本例中,由于它非常简单,因此即使我们没有指定格式,pandas也会了解如何转换此列。datetime
现在我们只需绘制我们的图表:
fig, ax = plt.subplots()
ax.plot(dataframe["DATE"], dataframe["TMAX"])
ax.plot(dataframe["DATE"], dataframe["TMIN"])
fig.autofmt_xdate()
fig.show()
Run Code Online (Sandbox Code Playgroud)
因此,完成所有操作后,您的代码应如下所示:
import pandas as pd
import matplotlib.pyplot as plt
filename = 'death_valley_2018_simple.csv'
dataframe = pd.read_csv(filename)
dataframe["DATE"] = pd.to_datetime(dataframe['DATE'], format="%Y-%m-%d")
fig, ax = plt.subplots()
ax.plot(dataframe["DATE"], dataframe["TMAX"])
ax.plot(dataframe["DATE"], dataframe["TMIN"])
fig.autofmt_xdate()
fig.show()
Run Code Online (Sandbox Code Playgroud)
pandas你可以在没有库的情况下做同样的事情pandas;你只需要手动做一些事情。
导入库(pandas这次没有):
import csv
import datetime
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)
这将创建一个类似于pandas数据框的Python字典:
filename = "death_valley_2018_simple.csv"
with open(filename, "r") as file:
csv_reader = csv.reader(file)
headers = next(csv_reader)
data = {}
for title in headers:
data[title] = []
for row in csv_reader:
for i, title in enumerate(headers):
data[title].append(row[i])
Run Code Online (Sandbox Code Playgroud)
和以前一样,我们应该将DATE列从转换str为datetime。我们还必须将TMAX和TMIN列转换为int; pandas自动为我们做了这个。第一个循环负责列DATE,第二个和第三个循环负责TMAX和TMIN列。
for i in range(len(data["DATE"])):
data["DATE"][i] = datetime.datetime.strptime(data["DATE"][i], "%Y-%m-%d")
for i in range(len(data["TMAX"])):
data["TMAX"][i] = int(data["TMAX"][i])
for i in range(len(data["TMIN"])):
data["TMIN"][i] = int(data["TMIN"][i])
Run Code Online (Sandbox Code Playgroud)
现在,我们可以绘制图表:
fig, ax = plt.subplots()
ax.plot(data["DATE"], data["TMAX"])
ax.plot(data["DATE"], data["TMIN"])
fig.autofmt_xdate()
fig.show()
Run Code Online (Sandbox Code Playgroud)
因此,完成所有操作后,您的代码应如下所示:
import csv
import datetime
import matplotlib.pyplot as plt
filename = "death_valley_2018_simple.csv"
with open(filename, "r") as file:
csv_reader = csv.reader(file)
headers = next(csv_reader)
data = {}
for title in headers:
data[title] = []
for row in csv_reader:
for i, title in enumerate(headers):
data[title].append(row[i])
for i in range(len(data["DATE"])):
data["DATE"][i] = datetime.datetime.strptime(data["DATE"][i], "%Y-%m-%d")
for i in range(len(data["TMAX"])):
data["TMAX"][i] = int(data["TMAX"][i])
for i in range(len(data["TMIN"])):
data["TMIN"][i] = int(data["TMIN"][i])
fig, ax = plt.subplots()
ax.plot(data["DATE"], data["TMAX"])
ax.plot(data["DATE"], data["TMIN"])
fig.autofmt_xdate()
fig.show()
Run Code Online (Sandbox Code Playgroud)
你说:
文件中有 365 行,因此最好将程序限制为仅获取前 10 行
搜索硬编码并阅读相关内容。硬编码对于初学者来说是一个菜鸟错误,我已经做过一千次了,但你必须意识到这一点。我们编写代码的方式并不关心文件中有 10 行csv还是 10,000 行。硬编码意味着您在程序中嵌入了一些不必要的数据,并且您的程序只能在某些示例中运行。您不应该编写一个仅在有 10 行或 100 行时才工作的程序,您应该编写您的程序,以便在不知道行数的情况下它也能工作。