python - 数据框和子图中的日期错误

标签 python pandas csv datetime dataframe

我正在尝试在 csv 文件中绘制数据。目前,如果我要转换它,我的日期也不会在图中正确显示。如何更改它以显示 Y-m-d 定义的正确数据格式?第二个问题是,我目前正在一个图中绘制所有数据,但希望为每个 Valuegroup 绘制一个子图。

我的代码如下所示:

import pandas as pd
import matplotlib.pyplot as plt

csv_loader = pd.read_csv('C:/Test.csv', encoding='cp1252', sep=';', index_col=0).dropna()

csv_loader['Date'] = pd.to_datetime(csv_loader['Date'], format="%Y-%m-%d")
print(csv_loader)

fig, ax = plt.subplots()
csv_loader.groupby('Valuegroup').plot(x='Date', y='Value', ax=ax, legend=False, kind='line')

plt.grid(True)

csv 文件如下所示:

Calcgroup;Valuegroup;id;Date;Value
Group1;A;1;20080103;0.1
Group1;A;1;20080104;0.3
Group1;A;1;20080107;0.5
Group1;A;1;20080108;0.9
Group1;B;1;20080103;0.5
Group1;B;1;20080104;1.3
Group1;B;1;20080107;2.0
Group1;B;1;20080108;0.15
Group1;C;1;20080103;1.9
Group1;C;1;20080104;2.1
Group1;C;1;20080107;2.9
Group1;C;1;20080108;0.45

最佳答案

您可以告诉 pandas 将该列解析为日期时间,它就会正常工作:

In[151]:
import matplotlib.pyplot as plt
t="""Calcgroup;Valuegroup;id;Date;Value
Group1;A;1;20080103;0.1
Group1;A;1;20080104;0.3
Group1;A;1;20080107;0.5
Group1;A;1;20080108;0.9
Group1;B;1;20080103;0.5
Group1;B;1;20080104;1.3
Group1;B;1;20080107;2.0
Group1;B;1;20080108;0.15
Group1;C;1;20080103;1.9
Group1;C;1;20080104;2.1
Group1;C;1;20080107;2.9
Group1;C;1;20080108;0.45"""
df = pd.read_csv(io.StringIO(t), parse_dates=['Date'], sep=';', index_col=0)
df

Out[151]: 
          Valuegroup  id       Date  Value
Calcgroup                                 
Group1             A   1 2008-01-03   0.10
Group1             A   1 2008-01-04   0.30
Group1             A   1 2008-01-07   0.50
Group1             A   1 2008-01-08   0.90
Group1             B   1 2008-01-03   0.50
Group1             B   1 2008-01-04   1.30
Group1             B   1 2008-01-07   2.00
Group1             B   1 2008-01-08   0.15
Group1             C   1 2008-01-03   1.90
Group1             C   1 2008-01-04   2.10
Group1             C   1 2008-01-07   2.90
Group1             C   1 2008-01-08   0.45

fig, ax = plt.subplots()
df.groupby('Valuegroup').plot(x='Date', y='Value', ax=ax, legend=False, kind='line')
plt.grid(True)    
plt.show()

结果:

enter image description here

除了你的格式字符串不正确之外,它应该是:

csv_loader['Date'] = pd.to_datetime(csv_loader['Date'], format="%Y%m%d")

但是,这不起作用,因为该列将作为 int 数据类型加载,因此您需要先转换为字符串:

csv_loader['Date'] = pd.to_datetime(csv_loader['Date'].astype(str), format="%Y%m%d")

要格式化 x 轴上的日期,您可以使用 matplotlib 中的 DateFormatter 请参阅相关内容:Editing the date formatting of x-axis tick labels in matplotlib

from matplotlib.dates import DateFormatter
fig, ax = plt.subplots()
df.groupby('Valuegroup').plot(x='Date', y='Value', ax=ax, legend=False, kind='line')

plt.grid(True)

myFmt = DateFormatter("%d-%m-%Y")
ax.xaxis.set_minor_formatter(myFmt)
plt.show()

现在给出情节:

enter image description here

关于python - 数据框和子图中的日期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268856/

相关文章:

python - 如何在不均匀的多类数据集上使用数据增强?

python - 使用 openweathermap api 解析字典(json)中的数据

python - 我可以将列名列表传递给 get_dummies() 以用作所有可能答案的列标签吗?

javascript - MongoDB 管理

python - 如何编辑flask-admin以支持 Multi-Tenancy ?

Python三元执行顺序

python - 如何使用 Python 将每个月的常数乘以原始时间序列

Python 将 StringIO 转换为二进制

python - 使用 CSV 作为 Web 应用程序的数据库有什么问题吗?

python - 使用 python io 从缓冲流组成行读取器