【问题标题】:Plotting time series by year only in Matplotlib仅在 Matplotlib 中按年绘制时间序列
【发布时间】:2019-04-01 23:04:15
【问题描述】:

我有一个日期时间格式的系列,如下所示:

2015-05-10  00:00:00

我想在同一时间段内在我的数据框中绘制两个不同的值,我已经尝试过:

plt.subplot(211)
plt.plot(df['Date'].dt.year, df['Avg'], color='r')
plt.show()
plt.subplot(212)
plt.plot(df['Date'].dt.year, df['MW'], color='b')
plt.show()

但这给了我一种奇怪的格式,甚至无法通过在绘图之外更改 ['Date'] 列来处理。

它绘制为:

2015.0    2015.5   2016.0   2016.5.....etc

也试过改成float形式,但无济于事。

我想要的只是从 2015 年到 2018 年的整个系列每年一次,但是当我转换为字符串或整数时,我会得到如下所示的内容:

【问题讨论】:

    标签: python python-3.x pandas datetime dataframe


    【解决方案1】:

    在我看来,.set_xticks 是设置您在 x 轴上看到的值的最易读的方式。

    import pandas as pd
    import matplotlib.pyplot as plt
    
    data =[ {"Date":"2015-05-10", "Avg":34}, {"Date":"2016-05-10", "Avg":32}, 
            {"Date":"2017-05-10", "Avg":31}, {"Date":"2015-05-10", "Avg":31}, 
            {"Date":"2015-05-10", "Avg":26}, {"Date":"2015-05-10", "Avg":29}]
    
    df = pd.DataFrame(data)
    
    ax = plt.subplot(111)
    ax.plot(df['Date'].dt.year, df['Avg'], color='r')
    ax.set_xticks([2015, 2016, 2017])
    
    plt.show()
    

    您似乎也遇到了问题,因为您每年都有多个值,因此它绘制了您所看到的垂直线。使用 pandas .groupby 函数的聚合值似乎是您想要的。

    df["Year"] = df["Date"].dt.year
    
    df = df.groupby("Year").mean().reset_index()
    
    ax = plt.subplot(211)
    ax.plot(df.Year, df['Avg'], color='r')
    ax.set_xticks([2015, 2016, 2017])
    
    plt.show()
    

    【讨论】:

    • 我已经转换为日期时间了,为什么还要再做一次?当我尝试这样做时,会发生与上述相同的事情;年份显示在 x 轴上,但将连续时间序列转换为在每年垂直达到峰值的线性序列。
    • 我不知道您已经转换为日期时间,我将删除它并编辑我的帖子。我无法想象你所说的问题 re:垂直峰值,你能发布现在显示的情节吗?
    • 张贴上面的图片!
    • 编辑我的答案
    猜你喜欢
    • 2015-04-03
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2018-12-02
    • 2017-10-08
    相关资源
    最近更新 更多