在 Matplotlib 中绘制“时间”与“日期”

Posted

技术标签:

【中文标题】在 Matplotlib 中绘制“时间”与“日期”【英文标题】:Plotting 'time' vs 'date' in Matplotlib 【发布时间】:2021-12-29 02:48:04 【问题描述】:

我有一本带有日期(年、月、日)和时间戳(小时、分钟、秒)的字典,如下所示:

dict = datetime.date(2021, 11, 1): [datetime.time(7, 43, 23)],
 datetime.date(2021, 11, 8): [datetime.time(6, 4, 45),
                              datetime.time(6, 3, 36),
                              datetime.time(5, 56, 26)],
 datetime.date(2021, 11, 12): [datetime.time(8, 5, 11),
                               datetime.time(5, 44, 45),
                               datetime.time(5, 24, 14),
                               datetime.time(4, 56, 5)]

我想用它做一个散点图。 首先我写了这段代码:

from matplotlib import pyplot as plt
for key, value in dict.items():
    x = [key]*len(value)
    y = value
    plt.scatter(x, y)
plt.tight_layout()
plt.show()

此代码产生错误:

TypeError: float() argument must be a string or a number, not 'datetime.time'

然后我尝试使用 matplotlib.dates 转换日期时间,将我的代码更改为:

from matplotlib import pyplot as plt
import matplotlib.dates as mdates
for key, value in dict.items():
    x = [mdates.date2num(key)]*len(value)
    y = [mdates.date2num(y) for y in value]
    plt.scatter(x, y)
plt.tight_layout()
plt.show()

这段代码产生了另一个错误:

ValueError: Could not convert object to NumPy datetime

起初,问题看起来很简单。 但是,现在我不明白如何使用 matplotlib 来处理它。

我的问题:

    如何使用 matplotlib 工具处理日期时间对象? 在 matplotlib 中处理 datetime 对象时如何正确设置刻度和刻度?

【问题讨论】:

【参考方案1】:

您可以使用 pandas 的日期时间功能:

import pandas as pd

arr = []
for key, value in dict.items():
    for time in value:
        arr.append([key, time])
        
df = pd.DataFrame(arr, columns=['day', 'time'])
df.day = pd.to_datetime(df.day)
df.time = pd.to_datetime(df.time.astype('str'))

plt.scatter(df.day, df.time)

【讨论】:

非常感谢您的回复!两个问题:(1)为什么我们需要使用 df.time.astype('str') 来创建时间点? (2) 是否可以在 00:00 到 23:59 之间设置 y 轴的限制,即设为 24 小时? (1) 因为否则它会抛出一个TypeError: <class 'datetime.time'> is not convertible to datetime。 (2) 可以加plt.ylim(pd.to_datetime('00:00:00'), pd.to_datetime('23:59:59'))【参考方案2】:

您可以通过结合合适的虚拟日期将time 对象转换为datetime,然后进行绘图:

from datetime import date
from datetime import datetime

value = [datetime.combine(date.today(), value) for v in value]
scatter(x, value)

matplotlib 不会为您执行此操作,因为它无法知道您想要的开始日期。

如果您不希望日期显示在 y 轴上,请设置日期格式化程序:https://matplotlib.org/stable/api/dates_api.html

【讨论】:

以上是关于在 Matplotlib 中绘制“时间”与“日期”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 matplotlib 在日期时间轴上绘制一个矩形?

在 matplotlib 中更改日期时间轴的格式

如何在pd.read.csv之后用matplotlib绘制日期?

在 matplotlib 中使用 axvspan 作为日期范围

根据星期时间统计日期总量,绘制matplotlib,pandas,Python

使用 Python 的 matplotlib 在 x 轴上绘制日期