gpt4 book ai didi

python - 绘制 python 日期时间的累积图

转载 作者:太空狗 更新时间:2023-10-29 16:56:56 26 4
gpt4 key购买 nike

假设我有一个日期时间列表,我们知道每个日期时间都是事件发生的记录时间。

是否有可能在 matplotlib 中绘制此事件随时间发生的频率,在累积图中显示此数据(以便每个点大于或等于它之前的所有点),而无需预处理此列表? (例如,将日期时间对象直接传递给一些很棒的 matplotlib 函数)

或者我是否需要将这个日期时间列表转换为字典项列表,例如:

{"year": 1998, "month": 12, "date": 15, "events": 92}

然后根据这个列表生成图表?

最佳答案

这应该适合你:

counts = arange(0, len(list_of_dates))
plot(list_of_dates, counts)

当然,您可以为 plot 调用提供任何常用选项,以使图形看起来像您想要的那样。 (我会指出 matplotlib 非常擅长处理日期和时间。)

另一个选项是 hist function - 它有一个可能有用的选项“cumulative=True”。您可以创建一个累积直方图,显示截至任何给定日期发生的事件数量,如下所示:

from pyplot import hist
from matplotlib.dates import date2num
hist(date2num(list_of_dates), cumulative=True)

但这会生成一个条形图,它可能不是您要找的东西,无论如何要正确显示横轴上的日期标签可能需要一些修改。

编辑:我觉得您真正想要的是每个日期一个点(或条),相应的 y 值是发生的事件数(包括?)那个日期。在那种情况下,我建议做这样的事情:

grouped_dates = [[d, len(list(g))] for d,g in itertools.groupby(list_of_dates, lambda k: k.date())]
dates, counts = grouped_dates.transpose()
counts = counts.cumsum()
step(dates, counts)

itertools 模块中的 groupby 函数将生成您正在寻找的数据类型:每个日期只有一个实例,并附有一个列表(一个具有该日期的所有 datetime 对象的迭代器,实际上)。正如 Jouni 在评论中所建议的那样,step 函数将提供一个图表,该图表会在事件发生的每一天逐步上升,因此我建议使用它来代替 plot.

(向 EOL 致敬,提醒我 cumsum)

如果你想每天都得一分,不管当天有没有发生任何事件,你需要稍微修改一下上面的代码:

from matplotlib.dates import drange, num2date
date_dict = dict((d, len(list(g))) for d,g in itertools.groupby(list_of_dates, lambda k: k.date()))
dates = num2date(drange(min(list_of_dates).date(), max(list_of_dates).date() + timedelta(1), timedelta(1)))
counts = asarray([date_dict.get(d.date(), 0) for d in dates]).cumsum()
step(dates, counts)

不过,我不认为它会对 step 函数产生的情节产生真正的影响。

关于python - 绘制 python 日期时间的累积图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com