matplotlib 绘制日期时间,时间增量

3ks5zfa0  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(168)

我正在做一个任务,我需要计算每天花费的时间,然后用条形图表示时间,所以对于这个任务,我使用python并能够获得每天花费的时间,并将其存储在列表“time_list”中,现在我不知道如何使用matplotlib函数绘制这个。
问题是,这个列表包含datetime.timedelta类的值。示例:

time_list
[datetime.timedelta(0, 23820), datetime.timedelta(0, 27480), datetime.timedelta(0, 28500), datetime.timedelta(0, 24180), datetime.timedelta(0, 27540), datetime.timedelta(0, 28920), datetime.timedelta(0, 28800), datetime.timedelta(0, 29100), datetime.timedelta(0, 29100), datetime.timedelta(0, 24480), datetime.timedelta(0, 27000)]

这些值的含义如下:

Total Time Spent on  2  is  6:37:00
Total Time Spent on  3  is  7:38:00
Total Time Spent on  4  is  7:55:00
Total Time Spent on  5  is  6:43:00
Total Time Spent on  8  is  7:39:00
Total Time Spent on  9  is  8:02:00
Total Time Spent on  10  is  8:00:00
Total Time Spent on  11  is  8:05:00
Total Time Spent on  12  is  8:05:00
Total Time Spent on  15  is  6:48:00
Total Time Spent on  16  is  7:30:00
xytpbqjk

xytpbqjk1#

我不认为你可以直接在Matplotlib中绘制timedelta,但既然你已经有了秒数,你可以定义一个自定义的刻度格式,将秒转换为小时和分钟。

from matplotlib.ticker import FuncFormatter

def format_func(x, pos):
    hours = int(x//3600)
    minutes = int((x%3600)//60)
    seconds = int(x%60)

    return "{:d}:{:02d}".format(hours, minutes)
    # return "{:d}:{:02d}:{:02d}".format(hours, minutes, seconds)

formatter = FuncFormatter(format_func)

然后,可以设置y轴的刻度格式化程序。
下面是一个使用bar的示例。

labels = [2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16]
seconds = [i.seconds for i in time_list]
f = plt.figure()
ax = f.add_subplot(1,1,1)
ax.bar(labels, seconds)

ax.yaxis.set_major_formatter(formatter)
# this locates y-ticks at the hours
ax.yaxis.set_major_locator(matplotlib.ticker.MultipleLocator(base=3600))
# this ensures each bar has a 'date' label
ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(base=1))

kupeojn6

kupeojn62#

虽然matplotlib原则上可以处理datetime对象,但条形图不能直接解释它们。因此,可以将任意日期添加到时间增量,并使用matplotlib.dates.date2num()转换为数字。然后使用一个DateFormatter就可以实现漂亮的ticklabels。

import numpy as np
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

days = [2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16]

time_list = [datetime.timedelta(0, 23820), datetime.timedelta(0, 27480), 
             datetime.timedelta(0, 28500), datetime.timedelta(0, 24180), 
             datetime.timedelta(0, 27540), datetime.timedelta(0, 28920), 
             datetime.timedelta(0, 28800), datetime.timedelta(0, 29100), 
             datetime.timedelta(0, 29100), datetime.timedelta(0, 24480), 
             datetime.timedelta(0, 27000)]

# specify a date to use for the times
zero = datetime.datetime(2018,1,1)
time = [zero + t for t in time_list]
# convert datetimes to numbers
zero = mdates.date2num(zero)
time = [t-zero for t in mdates.date2num(time)]

f = plt.figure()
ax = f.add_subplot(1,1,1)

ax.bar(days, time, bottom=zero)
ax.yaxis_date()
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))

# add 10% margin on top (since ax.margins seems to not work here)
ylim = ax.get_ylim()
ax.set_ylim(None, ylim[1]+0.1*np.diff(ylim))

plt.show()

lfapxunr

lfapxunr3#

当我想绘制y axis等于Timedelta64[ns]类型的数据时,我遇到了类似的问题。我从这个博客中找到了解决这个问题的最简单的方法:solution。简而言之,只需将列的dtype更改为.astype('timedelta64[m]')。您可以更改为小时,分钟或秒为您的情况下,只需更改值在一个方括号。它将y列的dtype更改为float64,然后您可以轻松地绘制条形图或使用正常单位(而不是纳秒)绘图

相关问题