如何计算月度变化并将其绘制为barchar

时间:2017-06-28 17:52:11

标签: python matplotlib

我有两个给定的数组,一个填充日期时间,另一个填充一些值。 这些数组在图表whit matplotlib中绘制为曲线。 现在我必须计算月度变化(每个月的第一个和最后一个值之间的差异)并将其绘制为barchar。 我知道如何绘制条形图,但我不知道如何使用python计算值并将它们放到新数组中,以便我可以绘制它们。

vals和dates数组具有相同的大小,而vals [x]是date [x]的值。日期数组中的日期时间也按升序排列。

这是一个小例子,我如何绘制值。例如,只有少数值。

import matplotlib.pyplot as plt
import datetime

fig,ax = plt.subplots()

# only exampledata, there are approx. 5000 values per day
vals = [1,2,3,6,7,3]
dates =[ datetime.datetime.strptime('2017-01-01T00:00:00', '%Y-%m-%dT%H:%M:%S'),
         datetime.datetime.strptime('2017-01-02T15:00:00', '%Y-%m-%dT%H:%M:%S'),
         datetime.datetime.strptime('2017-01-31T23:59:59', '%Y-%m-%dT%H:%M:%S'),

         datetime.datetime.strptime('2017-12-01T00:00:00', '%Y-%m-%dT%H:%M:%S'),
         datetime.datetime.strptime('2017-12-15T15:00:00', '%Y-%m-%dT%H:%M:%S'),
         datetime.datetime.strptime('2017-12-31T23:59:59', '%Y-%m-%dT%H:%M:%S')
       ]


ax.plot_date(dates, vals, ls='-',marker='',markevery=10000)
plt.grid(b=True, which='both', color='0.85',linestyle='-')

plt._show()

显示该数据的预期值为:

Jan 2
Feb 0
Mar 0
Apr 0
May 0
Jun 0
Jul 0
Aug 0
Sep 0
Oct 0
Nov 0
Dec -3

1 个答案:

答案 0 :(得分:1)

以下示例基于我对问题和所有评论的最佳理解,如果您不介意使用pandas。关键步骤是:

  1. 对数据进行排序,以确保每个月的​​第一个和最后一个值按顺序排列
  2. 按月分组数据
  3. 在每个组(月)中,应用last - first
  4. 使用每月更改为0的初始DataFrame,并使用上一步的结果更新
  5. 可选。将数据索引更改为缩写的月份名称
  6. 以下是代码:

    import datetime
    
    import matplotlib.pyplot as plt
    import pandas as pd
    
    vals = [1,2,3,6,7,3]
    dates =[datetime.datetime.strptime('2017-01-01T00:00:00', '%Y-%m-%dT%H:%M:%S'), 
            datetime.datetime.strptime('2017-01-02T15:00:00', '%Y-%m-%dT%H:%M:%S'), 
            datetime.datetime.strptime('2017-01-31T23:59:59', '%Y-%m-%dT%H:%M:%S'), 
    
            datetime.datetime.strptime('2017-12-01T00:00:00', '%Y-%m-%dT%H:%M:%S'), 
            datetime.datetime.strptime('2017-12-15T15:00:00', '%Y-%m-%dT%H:%M:%S'), 
            datetime.datetime.strptime('2017-12-31T23:59:59', '%Y-%m-%dT%H:%M:%S')
           ]
    
    df = pd.DataFrame(data=vals, index=dates)
    gdf = df.sort_index().groupby(df.index.month).apply(lambda g: g.iloc[-1] - g.iloc[0])
    mchange = pd.DataFrame([0] * 12, index=list(range(1,13)))
    mchange.update(gdf)
    mchange.index = pd.to_datetime(mchange.index, format="%m").strftime("%b")
    
    mchange.plot.bar()
    plt.legend().remove()
    plt.show()