【问题标题】:Wrong Dates in Dataframe and Subplots数据框和子图中的错误日期
【发布时间】:2018-12-18 12:19:33
【问题描述】:

我正在尝试在 csv 文件中绘制我的数据。目前,如果我正在转换它,我的日期也没有正确显示在图中。如何更改它以显示定义为 Y-m-d 的正确 dat 格式?第二个问题是我目前正在将所有数据绘制在一个图中,但希望每个 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

【问题讨论】:

    标签: python pandas csv datetime dataframe


    【解决方案1】:

    您的日期解析错误; "%Y-%m-%d" 适用于 2017 年 12 月 11 日(即 2017 年 12 月 12 日)这样的日期。您的日期格式为 "%Y%m%d",不带连字符。

    【讨论】:

      【解决方案2】:

      您可以告诉 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()
      

      结果:

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

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

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

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

      要格式化 x 轴上的日期,您可以使用 DateFormatter from matplotlib 参见相关: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()
      

      现在给出情节:

      【讨论】:

      • 非常感谢,不知何故,x 轴仍然没有显示正确的日期,但格式如上图所示。我希望 x 轴上显示的格式是“03-01-2008”。我还想知道如何在一个子图中显示每个 Valuegroup?
      • 查看相关stackoverflow.com/questions/14946371/…,我会更新我的代码和情节
      • 我已经更新了我的答案,如果您需要关于情节本身的进一步帮助,您应该接受我的回答并提出一个新问题,因为我不是 matplotlib 专家
      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多