我如何从 Python 中的 CSV 文件制作 graph/diagram?

How do i make a graph/diagram from a CSV file in Python?

这是我第一次在这个论坛提问,希望不要出洋相。 我是一名 IT 教育专业的学生,​​今天我被简要介绍了 CSV 和 Matplotlib 库。 一项任务是在此 CSV 文件中制作最高和最低温度以及相应日期的 graph/diagram。我需要行号,我需要程序来理解正确的 format/syntax 单元格,但我真的不知道该怎么做。

此处的 CSV 文件示例: "STATION","NAME","DATE","PRCP","TMAX","TMIN","TOBS" “USC00042319”,“美国加利福尼亚州死亡谷”,“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()

结果是这样"bar graph" 我从这里阅读了其他论坛帖子,在 Discord 上四处询问并阅读了 CSV 文档。也许答案就在那里,但我当时不明白。 我希望有人像我 5 岁一样向我解释这个。

个人建议

别担心;我接到你了。但首先是一些建议。我记得当我在这个论坛上发布我的第一个问题时,我不知道提问的正确方式(当时我的英语不是很好)。提出完美问题的关键是先进行搜索(您已经搜索过了),然后如果您没有找到答案,您应该尽可能清楚并尽可能简短地提出您的问题。我并不是说不要提供足够的信息,但是如果您可以用更少的字数提出您的问题并且您的问题仍然尽可能清楚,那么您应该这样做。为什么?因为事实是,如果问题很长,那么很多人都会跳过这个问题。刚才,当我打开你的问题看到这些台词时,我有点害怕,想跳过它:D,但我在几分钟内就解决了,一点也不可怕。我不太关心写长答案,因为有问题的人会在必要时阅读你的答案。 请注意,所有这些只是我的个人经历。你也应该寻找更好的新手指南在这个论坛和类似的平台上提问。我的建议:http://www.catb.org/~esr/faqs/smart-questions.html

现在答案

而不是 csv 库,它是一个 Python 标准库(意味着它在安装时是编程语言的一部分,不需要单独安装),我更喜欢使用 pandaspandas 会让你的生活更轻松。但是你必须先安装它:

pip install pandas

现在很简单,让我们导入所有内容并加载 csv 文件。

import pandas as pd
import matplotlib.pyplot as plt

filename = 'death_valley_2018_simple.csv'
dataframe = pd.read_csv(filename)

dataframe 包含您的 csv 文件的行和列。我们需要将 DATE 列从 str 转换为 datetime.

dataframe["DATE"] = pd.to_datetime(dataframe['DATE'], format="%Y-%m-%d")

所以我们只是告诉 pandas 将 DATE 列更改为 datetime,并且我们通过指定格式告诉年月日的数字在哪里场地。 %Y 代表年份,然后是破折号,%m 代表月份,并且...,我们使用大写 Y,因为 %y 代表年份,而我们只有右边的两位数字。在这种情况下,由于它非常简单,即使我们没有指定格式,pandas 也会理解如何将此列转换为 datetime

现在我们只需要绘制 diagram/graph:

fig, ax = plt.subplots()
ax.plot(dataframe["DATE"], dataframe["TMAX"])
ax.plot(dataframe["DATE"], dataframe["TMIN"])
fig.autofmt_xdate()
fig.show()

所以在完成所有操作后,您的代码应该如下所示:

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

没有pandas

你可以在没有 pandas 库的情况下做同样的事情;你只需要手动做一些事情。

正在导入库(这次没有 pandas):

import csv
import datetime

import matplotlib.pyplot as plt

这将创建一个类似于 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])

和以前一样,我们应该将 DATE 列从 str 转换为 datetime。我们还必须将 TMAXTMIN 列转换为 intpandas 自动为我们做了这个。第一个循环处理 DATE 列,第二个和第三个循环处理 TMAXTMIN 列。

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

现在,我们可以绘制 diagram/graph:

fig, ax = plt.subplots()
ax.plot(data["DATE"], data["TMAX"])
ax.plot(data["DATE"], data["TMIN"])
fig.autofmt_xdate()
fig.show()

所以在完成所有操作后,您的代码应该如下所示:

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

硬编码,菜鸟的错误

你说:

There is 365 lines in the file, so maybe it would be nice to limit the program to taking maybe the first 10 lines

搜索硬编码并阅读它。硬编码是初学者的菜鸟错误,我已经做过一千次了,但你必须意识到这一点。如果 csv 文件中有 10 行或有 10,000 行,我们编写代码的方式并不重要。硬编码意味着您在程序中嵌入了一些不必要的数据,并且您的程序只能在某些示例中运行。您不应该编写仅在有 10 行或 100 行时才有效的程序,您应该编写程序,使其在不知道行数的情况下也能正常工作。