首页 > 解决方案 > Python - Matplotlibs - 如何格式化并将间隔添加到具有日期和时间的 X 轴?

问题描述

我有如下所示的数据。该Date/Time字段是%m-%d-%Y %H:%M:%S格式。

           Date/Time  Utilization
 04-01-2020 10:00:00           10
 04-01-2020 10:10:00           20
 04-01-2020 10:20:00           50
 04-01-2020 10:30:00           10
 04-02-2020 15:30:00           20
 04-02-2020 15:40:00           10
 04-02-2020 15:50:00           10
 04-07-2020 23:40:00           40
 04-07-2020 23:50:00           50

我想在 Matplotlib 中绘制它,x 轴作为日期/时间,y 轴作为利用率。

当我绘制这个时,这 10 分钟的间隔中的每一个都在 X 轴上被挤压在一起(下面的屏幕截图): 在此处输入图像描述

我上面的代码是这样的:

def plot_graph(utilization_map):
    utilization_array = []
    date_array = []
    for each_time in utilization_map:
        utilization = utilization_map[each_time]
        utilization_array.append(utilization)
        human_time = convert_epoch_to_datetime_for_plots(each_time) # This converts the epoch time in %m-%d-%Y %H:%M:%S format
        date_array.append(human_time)
    x_axis = date_array
    y_axis = utilization_array
    plt.plot(x_axis, y_axis, color='b')
    plt.title("Utilization")
    plt.xlabel("Days")
    plt.ylabel("Percent of Utilization")
    plt.legend()
    plt.show()

问题:我想以 X 轴标签仅以%m-%d%m-%d-%Y格式显示的方式绘制它,并且以每日间隔而不是 10 分钟显示,因此所有时间都不会在 X 轴上混合在一起。我该怎么做呢?

标签: pythonmatplotlib

解决方案


  • 用于pandas.DataFrame.resample组合从 10 分钟到每天的数据,然后绘制它。
    • pd.DataFrame(df['util'].resample('D').sum())

进口

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import numpy as np

创建可重现的数据框

dates = pd.date_range(start='2014-04-01', end='2020-04-07', freq='10min').tolist()

np.random.seed(0) 
utilization = [np.random.randint(10, 50) for _ in range(len(dates))]


df = pd.DataFrame({'dates': dates, 'util': utilization})
df.set_index('dates', inplace=True)


                     util
dates                    
2014-04-01 00:00:00    26
2014-04-01 00:10:00    44
2014-04-01 00:20:00    36
2014-04-01 00:30:00    13
2014-04-01 00:40:00    41
2014-04-01 00:50:00    30
2014-04-01 01:00:00    21
2014-04-01 01:10:00    10
2014-04-01 01:20:00    25
2014-04-01 01:30:00    18

将数据帧重新采样为每日

df_daily = pd.DataFrame(df['util'].resample('D').sum())

            util
dates           
2014-04-01  4096
2014-04-02  4338
2014-04-03  4194
2014-04-04  4186
2014-04-05  4262
2014-04-06  4342
2014-04-07  4101
2014-04-08  4445
2014-04-09  4346
2014-04-10  4378

绘制数据框

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.plot(df_daily.index, df_daily['util'])
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.show()

在此处输入图像描述

  • 此数据是随机的,numpy因此对于此示例,所有平均总和约为 4200。

推荐阅读