【问题标题】:python plotting selected csv columnspython绘制选定的csv列
【发布时间】:2018-11-05 16:03:38
【问题描述】:

我有一个*.csv 文件,其中包含第一列格式为"YYYY-MM" 的日期、第二列上的字母和两列数据的数据。

它看起来像这样:

Date     inflation rate     CPI-Value      LIBOR-Rate

2003-09  inflation  rate    80.172         0.81
2003-10  inflation  rate    80.132         0.88
2003-11  inflation  rate    80.264         0.69
2003-12  inflation  rate    80.430         0.75
2004-01  inflation  rate    81.163         0.75
2004-02  inflation  rate    81.244         0.75
2004-03  inflation  rate    81.344         0.75
2004-04  inflation  rate    81.436         0.75
2004-05  inflation  rate    81.501         0.75
2004-06  inflation  rate    81.355         0.81
2004-07  inflation  rate    81.494         1.06
2004-08  inflation  rate    81.426         1.31
2004-09  inflation  rate    81.771         1.44
2004-10  inflation  rate    81.757         1.38
2004-11  inflation  rate    81.866         1.38
2004-12  inflation  rate    81.790         1.44
2005-01  inflation  rate    81.994         1.75
2005-02  inflation  rate    82.062         1.94
2005-03  inflation  rate    82.210         2.13
2005-04  inflation  rate    82.219         2.13
2005-05  inflation  rate    82.165         2.06

我想绘制一个以日期为 x 轴的折线图,以及一个包含 CPI 和 LIBOR 值的图。

我尝试过使用

x, y = np.genfromtxt(CPI_df, usecols=(0, 2), unpack=True, delimiter=',')

plt.plot(x, y, 'ro--')
plt.show()

但是有一个值错误,指出某些行只有一列而不是两列。但是,我已经检查了csv文件,没有丢失数据。

感谢我能得到的任何帮助,谢谢!

【问题讨论】:

  • 您使用delimiter=',',但您引用的文件中似乎没有逗号
  • 这是一个 csv 文件。那么这是否意味着我不需要放置分隔符?
  • 如果你显示的三行真的是你文件的前三行,那很明显没有逗号。但是我不确定在这种情况下使用什么其他分隔符,因为它似乎在单元格内也有空格。
  • 如果有帮助,我正在使用 jupyter notebook 运行代码。不知道有没有区别。
  • 不,在这种情况下没关系。如果您在编辑器中打开文件,并将前十行逐字复制到您的问题中,将会有帮助。

标签: python-3.x csv matplotlib


【解决方案1】:

使用的文件格式真的很不幸。首先,标题和数据之间有一个空行,因此您需要跳过前两行并且不能使用标题。
接下来,您有两个空格作为某些列之间的分隔符,但也有作为单列的字符串之间的分隔符。

现在如果你真的需要按原样使用这个文件,并且想使用 numpy 来读取它,你也会遇到第一列不包含数值的问题。所以你需要使用 dtype。

以下将读取文件并将日期绘制为字符串。

import numpy as np
import matplotlib.pyplot as plt

a = np.genfromtxt("data/inflation.txt", usecols=(0, 3), skip_header=2, dtype=None, encoding=None)
x = a["f0"]
y = a["f1"]

plt.plot(x, y, 'ro--')
plt.show()

或者,如果您想改为绘制日期,

import numpy as np
import datetime
import matplotlib.pyplot as plt

a = np.genfromtxt("data/inflation.txt", usecols=(0, 3), skip_header=2, dtype=None, encoding=None,
                  converters={0: lambda x: datetime.datetime.strptime(x, "%Y-%m")}, unpack=True)
x = a["f0"]
y = a["f1"]

plt.plot(x, y, 'ro--')
plt.show()

如果使用 pandas 而不是 numpy,这会变得更容易一些。绘制字符串:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data/inflation.txt", delim_whitespace=True)

plt.plot(df["Date"], df["CPI-Value"], 'ro--')
plt.show()

或绘制日期:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data/inflation.txt", delim_whitespace=True, 
                 parse_dates=[0], infer_datetime_format=True)

plt.plot(df["Date"], df["CPI-Value"], 'ro--')
plt.show()

【讨论】:

  • 我已尝试运行适用于我的数据的 pandas 脚本,但在绘制字符串时收到了一个关键错误。日期的绘图返回 TypeError: 'NoneType' object is not subscriptable。感谢您的所有帮助!
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2022-07-07
  • 2017-11-19
  • 2021-06-28
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多